多重继承:通过多重继承,一个子类就可以同时获得多个父类的所有功能
Mixln:目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系
对于多态继承中属性方法矛盾的问题参照博客:https://kevinguo.me/2018/01/19/python-topological-sorting/,文中的最左原则,我认为是从代码的先后顺序来讲。
定制类:Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。
__str__调用类时,print()返回特定的字符串,直接调用时,返回的是开发者看到的字符串。即__repr__
__iter__返回一个迭代对象,和__next__方法一起,调用next()
__getitem__取值和切片,isinstance(n, slice)
__getattr__当调用不存在的属性时,比如score
,Python解释器会试图调用__getattr__(self, attr)
来尝试获得属性
__call__()
方法,就可以直接对实例进行调用。
使用枚举类:
Enum
可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。
表达式为:
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
默认给Month.Jan赋值为1
若要精准控制则:可以调用@unique
使用元类:
使用type()既可以返回数据类型,也可以创建类。
>>> def fn(self, name='world'): # 先定义函数
... print('Hello, %s.' % name)
...
>>> Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
第一个参数为class名称;
第二个参数为继承的父类;
第三个参数为绑定的函数
使用metaclass:先定义metaclass,就可以创建类,最后创建实例.类可以看做是元类的实例。
# metaclass是类的模板,所以必须从`type`类型派生:
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass=ListMetaclass):
pass
L = MyList()
L.add(1)
print(L)