使用属性重写资源库:类型错误:'int'对象不可调用



我收到以下错误:

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

这是代码:

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

我看到后类方法TypeError"Int对象不可调用",但它对我没有帮助

Python 属性是非多态的: https://www.artima.com/forums/flat.jsp?forum=122&thread=153649

我得出的最好的是:

  1. 如果不需要覆盖 getter,那么您可以按父类名作为前缀
  2. setter 中没有代码:setter只调用其他方法

    2.a 执行二传手指令的已定义实例方法

    2.b 由二传手调用

    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
    

另一个答案似乎是最好的:

class B(A):
@A.level.setter
def level(self, new_level):
super(B, type(self)).level.fset(self, new_level)

最新更新