Board logo

标题: 面向对象编程(OOP) -2 [打印本页]

作者: look_w    时间: 2019-3-14 19:21     标题: 面向对象编程(OOP) -2

访问限制

    为了保护内部内部属性不让外部访问,可以在内部的属性名称前加上.在Python中,实例的变量名如果以开头,那么该变量就变成私有变量(private),只有内部可以访问,外部不可以访问

    这样就确保了外部的代码不能随便修改对象内部的状态,这样通过访问限制的保护,代码更加健壮
    可以通过外部直接修改,为什么要大费周章的这样呢?因为在方法中,可以对参数进行检查,避免传入无效的参数

    class Student(object):
        def __init__(self, name, score):
              self.__name = name
              self.__score = score
        def set_name(self, score):
              if  0 <=  score <=100:
                  self.__score = score
              else:
                  raise ValueError('bad score')

    需要注意的是,在Python中变量名类似xxx(以双下划线开头,以双下划线结尾的)的是特殊变量,特殊变量是可以直接访问的,不是private变量,所以不能用name score等变量名
    有时候会看到_name的实例变量名,这样的实例变量是可以访问的,但是按照约定俗称的规定,当你看到这样的变量时,意思就是:'虽然我可以被访问,但是请把我视为私有变量,请不要轻易访问我'
    双下划线的__name是不是一定不能从外部访问呢?不是 其实是Python解释器对外,把__name变量改变成了_Student__name了,所以你可以通过_Student__name来访问__name(但是可能不同版本的Python解释器会把__name改成不同的变量名)
    总结来说,Python本身没有任何机制阻止你干坏事,全靠自觉

    下面这种写法:



继承和多态

    在OOP的程序设计中,当我们定义一个class的时候,可以从某个现有的class直接继承,新的class称为子类(Subclass),而被继承的类我们称之为父类 超类 或者基类
    继承的最大好处就是子类获得了父类的全部的功能
    当子类和父类都存在相同的run()方法,子类的run()方法会覆盖父类的run()方法,在代码运行的时候,总是会调用子类的run()方法,这样我们就获得了继承的另一个好处:多态
    由于Animal类方法有run()方法.因此,传入的任意类型,只要是Animal类或者其子类,就会自动调用实际类型的run()方法,这就是多条的意思
    '开闭'原则:对扩展开放:允许新增Animal子类 对修改封闭:不需要修改依赖Animal类型的run_twice()等函数
    继承树 任何类,最终都可以追溯到根类object




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0