我们可以从没有实例化的 class 中调用方法吗
Can we call a method from within a class of no instantiation
我想请问是否有一种方法可以在 class 中实现接口方法而无需实例化,甚至更多,如果这完全是一种不好的做法?如果是这样,实现复杂接口方法的正确方法是什么?
这是我的代码原型:
class calculator(abc.ABC):
@abc.abstractmethod
def calculate(self):
"start model"
class subcalculator(calculator):
def calculate(self):
return model.attr2 ** 3
def recalculate(self):
z = calculate(self)
return z ** 2
但是,此报告 calculate()
在 运行 subcalculator.recalculate
时未定义,因为它未实例化。
因为我只是在为我的模型编写接口classes,我想写启动不是一个好主意。(或者是吗?)在这种情况下我该怎么办?
编辑: 根据@chepner 的回答,我也想出了一些 hackish 的方法来解决这个问题,我不确定这是否是正确的做法:
@classmethod
def recalculate(cls, self):
z = cls.calculate(self)
return z ** 2
另外值得一提的是结构的 object/model 部分:
#In model.py
class model(object):
def __init__(self, attr1):
self.attr1 = attr1
class submodel(model):
def __init__(self, attr1, attr2):
super().__init__(attr1)
self.attr2 = attr2
所以我希望将calculator
写成一个接口class,它可以与model
等进行交互
calculate
是一种方法,无论您是否曾经创建实例,都必须这样引用。
class subcalculator(calculator):
def calculate(self):
return model.attr2 ** 3
def recalculate(self):
z = subcalculator.calculate(self)
return z ** 2
当然,最好让继承模型准确判断需要调用哪个calculate
方法:
def recalculate(self):
z = self.calculate()
return z ** 2
我想请问是否有一种方法可以在 class 中实现接口方法而无需实例化,甚至更多,如果这完全是一种不好的做法?如果是这样,实现复杂接口方法的正确方法是什么?
这是我的代码原型:
class calculator(abc.ABC):
@abc.abstractmethod
def calculate(self):
"start model"
class subcalculator(calculator):
def calculate(self):
return model.attr2 ** 3
def recalculate(self):
z = calculate(self)
return z ** 2
但是,此报告 calculate()
在 运行 subcalculator.recalculate
时未定义,因为它未实例化。
因为我只是在为我的模型编写接口classes,我想写启动不是一个好主意。(或者是吗?)在这种情况下我该怎么办?
编辑: 根据@chepner 的回答,我也想出了一些 hackish 的方法来解决这个问题,我不确定这是否是正确的做法:
@classmethod
def recalculate(cls, self):
z = cls.calculate(self)
return z ** 2
另外值得一提的是结构的 object/model 部分:
#In model.py
class model(object):
def __init__(self, attr1):
self.attr1 = attr1
class submodel(model):
def __init__(self, attr1, attr2):
super().__init__(attr1)
self.attr2 = attr2
所以我希望将calculator
写成一个接口class,它可以与model
等进行交互
calculate
是一种方法,无论您是否曾经创建实例,都必须这样引用。
class subcalculator(calculator):
def calculate(self):
return model.attr2 ** 3
def recalculate(self):
z = subcalculator.calculate(self)
return z ** 2
当然,最好让继承模型准确判断需要调用哪个calculate
方法:
def recalculate(self):
z = self.calculate()
return z ** 2