简体   繁体   English

使用属性覆盖 setter:TypeError: 'int' 对象不可调用

[英]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"但它没有帮助我

The best I have come up is this:我想出的最好的是:

  1. If there is no need to override the getter then you can prefix by parent class name如果不需要覆盖 getter,则可以使用父类名作为前缀
  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM