面向对象高级

面向对象高级

下面将讨论多重继承、定制类、元类等概念。

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的方式。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180323G07RQX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券