我在分配赋值运算符时遇到问题.
我已成功超载__setattr__.但是在对象初始化之后,我想做__setattr__其他事情,所以我尝试将它指定为另一个函数,__setattr2__.
码:
class C(object):
def __init__(self):
self.x = 0
self.__setattr__ = self.__setattr2__
def __setattr__(self, name, value):
print "first, setting", name
object.__setattr__(self, name, value)
def __setattr2__(self, name, value):
print "second, setting", name
object.__setattr__(self, name, value)
c = C()
c.x = 1
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
first, setting x
first, setting __setattr__
first, setting x
Run Code Online (Sandbox Code Playgroud)
我想要/期望的是什么:
first, setting x
first, setting __setattr__
second, setting x
Run Code Online (Sandbox Code Playgroud)
来自文档:
查找新式类的特殊方法
对于新式类,只有在对象的类型上定义,而不是在对象的实例字典中,才能保证对特殊方法的隐式调用才能正常工作.这种行为是以下代码引发异常的原因(与旧式类的等效示例不同):
Run Code Online (Sandbox Code Playgroud)>>> class C(object): ... pass ... >>> c = C() >>> c.__len__ = lambda: 5 >>> len(c) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'C' has no len()