我想使用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__
方法呢?
答案 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