1 python通过元类为客户类自动添加方法
python为不同的类添加相同的方法,有多种方式。
若已知需添加的方法,可以通过继承添加方法,或对象嵌入的组合进行添加。
若需添加的方法为动态不可知,可以通过辅助函数或元类进行添加。
1.1 通过手动扩展
描述
若明确知道要扩展的方法,则可以在创建类后,手动添加方法。
添加的方法,至少有1个入参,用于充当self。
缺点:如果很多类都需要添加方法时,必须重复赋值添加,修改方法后,还得全部修改。
示例
>>> class ClsA:def __init__(self,value):self.value=valuedef double(self):return self.value*2>>> class ClsB:value=5# obj 类似 self,类的方法第1个入参为self
>>> def triple(obj):return obj.value*3>>> def joinf(obj,value):return value+'手动扩展'# 创建类后手动添加方法
>>> ClsA.triple=triple
>>> ClsA.joinf=joinf
>>> ClsB.triple=triple
>>> ClsB.joinf=joinf
>>> ca1=ClsA(6)
>>> ca1.double()
12
>>> ca1.triple()
18
>>> ca1.joinf('ca1')
'ca1手动扩展'
>>> cb1=ClsB()
>>> cb1.triple()
15
>>> cb1.joinf('cb1')
'cb1手动扩展'
1.2 通过元类扩展
描述
元类在创建类对象时自动运行指定代码。所以可以通过元类来扩展给类对象添加指定方法。
定义一个元类,重载__new__()方法,通过类属性字典classdict[属性]=值,给类对象添加方法。
客户类指定元类后,客户类对象会自动被元类添加方法。
通过元类扩展类对象的属性,减少重复代码,只需一处修改,编译维护。
示例
# obj 类似 self,类的方法第1个入参为self
>>> def triple(obj):return obj.value*3>>> def joinf(obj,value):return value+'元类自动扩展'>>> class MyMeta(type):def __new__(meta,classname,supers,classdict):classdict['triple']=tripleclassdict['joinf']=joinfreturn type.__new__(meta,classname,supers,classdict)# 通过元类自动添加方法
>>> class ClsA(metaclass=MyMeta):def __init__(self,value):self.value=valuedef double(self):return self.value*2>>> class ClsB(metaclass=MyMeta):value=5>>> ca1=ClsA(6)
>>> ca1.double()
12
>>> ca1.triple()
18
>>> ca1.joinf('ca1')
'ca1元类自动扩展'
>>> cb1=ClsB()
>>> cb1.triple()
15
>>> cb1.joinf('cb1')
'cb1元类自动扩展'