一,多重继承
定义:一个子类可以继承自多个父类
目的:同时拥有多个父类的所有功能,且减少设计层次。
Mixln:某子类中,需要混入额外功能,可以通过多重继承实现,这种设计,被叫做Mixln
二,定制类
解释:通过魔术方法的定义,是自定义的类满足某些特性。
__str__:调用print函数时,实现友好输出。
__repr__:直接调用对象时,实现友好输出。
示例:
不定义直接返回
class Student(object):
pass
s=Student() #实例化
s #返回结果:<write_blog.定制类.Student object at 0x000001C620AFE780>
print(s) #返回结果:<write_blog.定制类.Student object at 0x000001C620AFE780>
定义以上两个方法:
class Student(object):
def __init__(self,name):
self.name=name
def __repr__(self):
return 'my name is Student %s'%self.name
def __str__(self):
return 'this is a student object %s'%self.name
s=Student('xiaoxinxin') #实例化
s #返回结果:my name is Student xiaoxinxin
print(s) #返回结果:this is a student object xiaoxinxin
__iter__:将对象变为可迭代对象。
__getitem__:可以根据索引取对象中的值。
示例:
class Student(object):
def __iter__(self):
return self
def __getitem__(self, item):
return 'a'
s=Student()
isinstance(s,Iterable) #返回True
s[1] #返回a
__setitem__:
把对象视作list或dict来对集合赋值。
__delitem__:
用于删除某个元素。
示例:
def __setitem__(self, key, value):
self.key=value
return self
def __delitem__(self, key):
del self.key
return self
__getattr__:对象中不包含某个属性时,为了不使其报错,可以定义此函数,用于友好返回。
__call__:直接用实例调用时,进行的操作,例如一个Student类的对象s,在用s()调用时,需要进行的操作。
示例:
def __getattr__(self, item):
if item=='score':
return 99
def __call__(self, *args, **kwargs):
return '为%s疯狂打call'%self.name
三,枚举类
枚举:一个有穷序列,每一个元素是一个常数声明。
枚举的应用场景:一个变量,有几种常用的取值。
枚举类的主要用途:定义常量。
示例:
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
四,元类
定义:用metaclass函数,定义对类的某些限制。
用法:先定义一个metaclass类,里面包含某种限制,再定义一个子类,然后利用metaclass参数,指向该元类。子类就可以实现元类中的限制。
目的:通过元类,修改类定义。
主要应用案例:ORM。
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