Python TypeError:'float'对象不可调用 - 使用@property装饰器、抽象类和 super()



我创建了一个简短的代码来了解更多关于抽象类和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装饰器一起使用。

现在,我不是专家,正如我之前所说,我正在努力理解这个话题。

我的问题是,为什么在使用装饰器@propertysuper时会出现这个错误?为什么这不可能?

提前谢谢。

@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

最新更新