[英]Override setter with property: TypeError: 'int' object is not callable
I am getting the following error:我收到以下错误:
Traceback (most recent call last):
File ".../TEST.py", line 34, in <module>
b.level = 12 # Error
File ".../TEST.py", line 23, in level
super().level(self, new_level)
TypeError: 'int' object is not callable
And here is the code:这是代码:
class A:
def __init__(self):
self._level = 0
@property
def level(self):
return self._level
@level.setter
def level(self, new_level):
self._level = new_level
class B(A):
def __init__(self):
super().__init__()
@property
def level(self):
return self._level
@level.setter
def level(self, new_level):
super().level(self, new_level)
a = A()
print(a.level) # --> 0
a.level = 12
print(a.level) # --> 0
b = B()
print(b.level) # --> 12
b.level = 12 # Error
print(b.level) # never reached
I saw that post class method TypeError "Int object not callable" but it did not help me我看到帖子类方法 TypeError "Int object not callable"但它没有帮助我
Python 属性是非多态的: https : //www.artima.com/forums/flat.jsp?forum=122&thread=153649
The best I have come up is this:我想出的最好的是:
No code in setter : setters only call other methods setter 中没有代码:setter 只调用其他方法
2.a Defined instance methods which do the setter instructions 2.a 定义了执行 setter 指令的实例方法
2.b Which are called by the setters 2.b 由 setter 调用
class A: def __init__(self): self._level = 0 def A_level_setter(self, new_level): # 2.a print('Setter instructions of A') self._level = new_level @property def level(self): return self._level @level.setter def level(self, new_level): self.A_level_setter(new_level) # 2.b class B(A): def B_level_setter(self, new_level): # 2.a print('Setter instructions of B') self.A_level_setter(new_level) @A.level.setter # 1. def level(self, new_level): self.B_level_setter(new_level) # 2.b class C(A): pass a = A() print(a.level) # 0 b = B() print(b.level) # 0 c = C() print(c.level) # 0 a.level = 1 # Setter instructions of A print(a.level) # 1 b.level = 2 # Setter instructions of A # Setter instructions of B print(b.level) # 2 c.level = 3 # Setter instructions of A print(c.level) # 3
Another answer seems to be the best one:另一个答案似乎是最好的:
class B(A):
@A.level.setter
def level(self, new_level):
super(B, type(self)).level.fset(self, new_level)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.