我创建了一个简短的代码来了解更多关于抽象类和python中的getter decorator以及super
的信息。这是我的代码:
from abc import ABC, abstractmethod
class Abstract_class(ABC):
@abstractmethod
def cal(self):
pass
class Sub_class1(Abstract_class):
def __init__(self, num1, num2):
super().__init__()
self.num1 = num1
self.num2 = num2
@property#remove to make it work
def cal(self):
return ( (self.num1/100) * self.num2 ) + 50
class Sub_class2(Sub_class1):
def __init__(self, num1, num2, num3):
super().__init__(num1, num2)
self.num3 = num3
class Sub_class3(Sub_class2):
def Real_num3(self):
valor = super().cal()
r_num3 = (valor**2) + (self.num3/100)
return r_num3
x = Sub_class3( 80, 120, 10000
print( x.Real_num3() )
上面所说的代码向我显示了错误:TypeError: 'float' object is not callable
。我发现,通过删除Sub_class1
中的@property
装饰器,我的问题得到了解决。
我在这里假设不可能将super
与@property
装饰器一起使用。
现在,我不是专家,正如我之前所说,我正在努力理解这个话题。
我的问题是,为什么在使用装饰器@property
和super
时会出现这个错误?为什么这不可能?
提前谢谢。
用@property
修饰函数后,不再调用它,而是使用.cal
来访问它(删除括号(。
您的Sub_class3可以如下所示:
class Sub_class3(Sub_class2):
def Real_num3(self):
valor = super().cal # cal is a property not method - you use a @property decorator to change that method to property
r_num3 = (valor ** 2) + (self.num3 / 100)
return r_num3