一.python的面向对象编程
在java 里,万物皆对象,不再考虑程序的执行具体过程,而把对象作为基本单元,一个对象包含了数据(属性)和操作数据的函数(方法),数据封装、继承和多态是面向对象的三大特点
1.1 类和实例
python 中的类通过class关键字定义
1.2访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
1.3 继承和多态
1.3.1 继承
当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class),继承的好处:1>.子类获得了父类的全部功能
2>.子类可以覆盖父类的方法,(也就是改进父类的方法,也就是多态)
1.3.2 多态
当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样,判断一个变量是否是某个类型可以用isinstance()判断
1.4 使用__slots__
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性,在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
1.5 多重继承
MixIn 设计:在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称之为MixIn,这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。
1.6 定制类
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。__slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()函数。除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类
1.6.1 __str__ : 定义__str__()方法,返回一个好看的字符串
1.6.2 __iter__ :如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环
1.6.3 __getattr__ :我们调用类的方法或属性时,如果不存在,就会报错
1.6.4. __call__ :任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用
1.7 使用枚举
精确地控制枚举类型,可以从Enum派生出自定义类