访问限制
为了保护内部内部属性不让外部访问,可以在内部的属性名称前加上.在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 |