在Python中分配(或重新重载)赋值运算符的麻烦

cha*_*ppy 5 python

我在分配赋值运算符时遇到问题.

我已成功超载__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)

Eri*_*ric 8

来自文档:

查找新式类的特殊方法

对于新式类,只有在对象的类型上定义,而不是在对象的实例字典中,才能保证对特殊方法的隐式调用才能正常工作.这种行为是以下代码引发异常的原因(与旧式类的等效示例不同):

>>> 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()
Run Code Online (Sandbox Code Playgroud)