类与对象
1 | python 类 |
成员可见性
成员是具有内外之分的,如下例中student1.do_homework()
就是外部调用,do_english_homework()
是内部调用(在一个类中的方法内部调用另一个方法)。
所有成员都可以在外部访问,安全性无法得到保证。
1 | class Student(): |
举个例子,如下例中,学生的分数(score)不希望被外部更改,而只能通过内部的方法进行更改。
不应通过直接访问变量来修改变量值,推荐通过方法来进行更改。
python中没有类似public
和private
关键字,而是通过双下划线__
来区分私有方法和私有属性。前后均有双下划线的方法不被认为是私有方法(例如__init__
)。
1 | class Student(): |
- 私有变量可以从外部访问,私有方法无法从外部访问。
- 私有变量之所以可以从外部读取,是因为 python 的动态变量特性,
student1.__score = -1
相当于新添加了一个实例变量,此处并不是self.__score = 0
中定义的变量。 student1.__dict__
打印出了'_Student__score'
是将私有变量更名了(保护机制),正是因为私有变量更名,所以'__score': -1
才可动态添加进去。- python 并没有提供一个机制完全保护了私有变量,因为可通过
student1._Student__score
来读取,但是一般情况下不要这么用。
面向对象三大特性
继承性
继承性的作用在于避免重复定义属性和方法。当子类继承父类,则具有了父类中的方法(构造函数)。
继承的写法如下:
1 | # 父类 |
注:python可以多继承,即一个子类可以继承多个父类。
当子类和父类均有构造函数时,实例化对象时,子类和父类中的参数均需传入。并通过父类.__init__(self, 参数)
的方式将参数传入。其中,self
必须显式传入,这是因为它更像是一个普通方法的调用,所有参数必须显式传入,其次,通过类(Human)来调用实例方法(__init__()
),必须传入所有参数(参考Student.do_homework()
的用法)。
1 | # 父类 |
子类方法调用父类方法
子类方法中可以通过 super 关键字来调用父类方法。调用方法如下:
1 | super(当前子类,self).父类方法 |
尽管在上例中,我们可以通过Human.__init__(self, name, age)
来调用父类方法,但调用类的实例方法是不推荐使用的。
1 | # 父类 |
此外,super
关键字不仅可以用在子类的构造函数中,也可以用在子类的任何函数里。
注:当子类存在与父类完全同名的方法时,优先调用子类的方法。
封装性
稍后介绍
多态性
稍后介绍