如何正确调用python3中的默认__setattr__?

时间:2016-06-06 19:23:01

标签: python python-3.x

我想使用python 3.4.3覆盖python类上的__setattr__方法。我找到了this answer,但它似乎不起作用,因为我收到错误。

完整代码如下:

class TestClass(object):

    def __init__(self):
        self.x = 4

    def __setattr__(self, name, value):
        # do something special given the 'name'

        #default behavior below
        super(TestClass).__setattr__(name, value)

test = TestClass()

,错误是

Traceback (most recent call last):
  File "client_1.py", line 26, in <module>
    test = TestClass()
  File "client_1.py", line 17, in __init__
    self.x = None
  File "client_1.py", line 23, in __setattr__
    super(TestClass).__setattr__(name, value)
AttributeError: 'super' object has no attribute 'x'

我假设属性x无法设置,因为它尚未定义。尝试定义此属性的行(在__init__中)无法定义属性,因为它调用了覆盖的方法...

如何定义属性x而无需隐式调用覆盖的__setattr__方法呢?

2 个答案:

答案 0 :(得分:3)

super在Python3中不需要参数(至少在重写实例方法的情况下):

super().__setattr__(name, value)

相当于Python2的

super(MyClass, self).__setattr__(name, value)

虽然仍有效。

答案 1 :(得分:3)

你只使用类调用super,这在某些情况下是有效的,但在这种情况下你想要超级实例。在Python 2中,您可以使用类和self来调用它,在Python 3中,您可以不带参数调用它。

class Spam:
    def __setattr__(self, name, value):
        # super(Spam, self).__setattr__(name, value)  # old, but still works
        super().__setattr__(name, value)  # new and cool

spam = Spam()
spam.eggs = 'python'  # works