
不幸的是,没有办法“在初始化之后重写” python特殊方法。作为该查询工作方式的副作用。问题的症结在于python实际上并没有查看实例。除了要上课
在开始查找特殊方法之前;因此无法获取对象的状态来影响查找哪个方法。
如果您不喜欢中的特殊行为
__init__,则可以重构代码以放入特殊知识
__setattr__。就像是:
class Foo(object): __initialized = False def __init__(self, a, b): try: self.a = a self.b = b # ... finally: self.__initialized = True def __setattr__(self, attr, value): if self.__initialzed: print(self.b) super(Foo, self).__setattr__(attr, value)
编辑:实际上,有一种方法可以更改查找的特殊方法,只要在初始化后 更改其类即可
。这种方法将使您深入了解元类的杂草,因此,在不做进一步解释的情况下,其外观如下:
class AssignableSetattr(type): def __new__(mcls, name, bases, attrs): def __setattr__(self, attr, value): object.__setattr__(self, attr, value) init_attrs = dict(attrs) init_attrs['__setattr__'] = __setattr__ init_cls = super(AssignableSetattr, mcls).__new__(mcls, name, bases, init_attrs) real_cls = super(AssignableSetattr, mcls).__new__(mcls, name, (init_cls,), attrs) init_cls.__real_cls = real_cls return init_cls def __call__(cls, *args, **kwargs): self = super(AssignableSetattr, cls).__call__(*args, **kwargs) print "Created", self real_cls = cls.__real_cls self.__class__ = real_cls return selfclass Foo(object): __metaclass__ = AssignableSetattr def __init__(self, a, b): self.a = a self.b = b for key, value in process(a).items(): setattr(self, key, value) def __setattr__(self, attr, value): frob(self.b) super(Foo, self).__setattr__(attr, value)def process(a): print "processing" return {'c': 3 * a}def frob(x): print "frobbing", xmyfoo = Foo(1, 2)myfoo.d = myfoo.c + 1欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)