python为不同的类添加相同的方法,有多种方式。
若已知需添加的方法,可以通过继承添加方法,或对象嵌入的组合进行添加。
若需添加的方法为动态不可知,可以通过辅助函数或元类进行添加。
描述
若明确知道要扩展的方法,则可以在创建类后,手动添加方法。
添加的方法,至少有1个入参,用于充当self。
缺点:如果很多类都需要添加方法时,必须重复赋值添加,修改方法后,还得全部修改。
示例
>>> class ClsA:
def __init__(self,value):
self.value=value
def 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手动扩展'
描述
元类在创建类对象时自动运行指定代码。所以可以通过元类来扩展给类对象添加指定方法。
定义一个元类,重载__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']=triple
classdict['joinf']=joinf
return type.__new__(meta,classname,supers,classdict)
# 通过元类自动添加方法
>>> class ClsA(metaclass=MyMeta):
def __init__(self,value):
self.value=value
def 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元类自动扩展'