面向对象高级
下面将讨论多重继承、定制类、元类等概念。
1.使用__slots__
通常情况下,可以给一个实例绑定方法和属性。但是给一个实例绑定的方法,对另一个实例是不起作用的。
为了让所有的实例都起作用,可以给class绑定方法。动态绑定允许我们在程序运行的过程中动态的给class加上功能。
但是如果想要限制实例的属性怎么做呢?比如只允许给Student类添加name和age属性。这时就用到了 变量。
注意:这里定义的 变量仅对当前类的实例起作用,对继承的子类无效,除非子类也定义 变量。子类允许定义的属性就是自身的 加上父类的 。
2.使用@property
如果绑定属性时,直接把属性暴露出来,这样简单但是没有办法检查参数,如果用set方法设置参数,又显得有些复杂。
所以Python内置的 装饰器负责把一个方法变成属性调用,既能检查参数,又可以用类似属性这样的简单方式来访问类的变量。
它的使用方法是把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。
可以看到实际上还是使用了getter和setter方法,只是调用的时候可以直接使用属性,比较简洁明了。
也可以只定义getter方法,不定义setter方法。就是一个只读属性。即只定义@property,不定义@xxx.setter方法。
3.多重继承
与Java不同,Python中一个类可以继承多个父类,获得父类的所有功能。如:
在设计类的继承关系时,通常主线单一继承,额外的功能通过多重继承,这种设计成为MixIn。实际上就跟Java中的接口一样。只是在Python中,实质上还是类。
多重继承的遵循拓扑排序,在继承顺序中遵循最左原则。
4.定制类
方法打印一个实例。其实与Java中的toString()方法类似。
类如果想被用于for...in循环,需要实现 方法。
如果想要表现像list那样可以按照下标取出元素,需要实现 方法。但是如果想要正确实现下标,切片,包括step的切片,需要做很多的工作。
如果对象是dict, 的参数也可能是一个可以作key的object,例如str。
的参数也可能是一个可以作key的object,例如str。
要避免没有找到attribute的错误,除了可以加上一个属性外,Python还有另一个机制,那就是写一个 方法,动态返回一个属性。
当调用不存在的属性时,比如score,Python解释器会试图调用 来尝试获得属性,这样,我们就有机会返回属性值。
只有在没有找到属性的时候,才会调用 方法,
直接对实例进行调用的方法,就需要定义 方法,任何类只要定义了 方法,就可以直接对实例进行调用。
5.枚举类
枚举关键字 。
这样可以调用Month中的所有常量。而可以使用Month.Oct的方式。
领取专属 10元无门槛券
私享最新 技术干货