python通过元类为客户类自动添加方法

1 python通过元类为客户类自动添加方法

python为不同的类添加相同的方法,有多种方式。

若已知需添加的方法,可以通过继承添加方法,或对象嵌入的组合进行添加。

若需添加的方法为动态不可知,可以通过辅助函数或元类进行添加。

1.1 通过手动扩展

描述

若明确知道要扩展的方法,则可以在创建类后,手动添加方法。

添加的方法,至少有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手动扩展'

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']=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元类自动扩展'

你可能感兴趣的:(python,python)