我成功地创建了一个装饰器来装饰任何类型的类,为它们添加一个标准接口,以便于访问、集成等......
我一直拒绝使用元类,因为关于这一点的文献说它是一种矫枉过正,而且大多数时候可以用类装饰器来代替。困扰我的是以下几点:
def Decorator(somearg):
def wrapper(cls):
clsinit = cls.__init__
cls.members = []
def __init__(self, *args, **kwargs):
#do something with somearg...
self.__class__.members.append(self)
clsinit(self,*args,**kwargs)
cls.__init__ = clsinit
return cls
return wrapper
@Decorator('thearg')
class A(object):
pass
a = A()
b = A()
使用 python 调试器,在导入时,类 A 立即用参数 'thearg' 修饰。但是每次我实例化 A() 时,实例都会直接调用装饰器中定义的 init,而不会经过前面的层。这很棒,因为我希望我的班级记录每个成员,而不是在每次实例化新实例时都重置。但我不确定我明白为什么。
有人可以在这种特定情况下解释 python 解释器的物理特性吗?