很明显,下面是我从屁股里拿出来的一个非常简单的例子,但我只是想了解一下是否应该在这些类型的实例中使用@classmethod。
我应该让每个辅助函数(除法、减法、乘法)成为一个类方法,还是应该像我现在所做的那样只引用类?标准是什么?
class Calculation:
divide_factor: int = 2
multiply_factor: int = 5
subtract_factor: int = 10
def divide(value: float) -> float: return value / Calculation.divide_factor
def multiply(value: float) -> float: return value * Calculation.multiply_factor
def subtract(value: float) -> float: return value - Calculation.subtract_factor
@classmethod
def grand_calculation(cls, value: float) -> float:
print(f'Divide result is {cls.divide(value=value)}')
print(f'Multiply result is {cls.multiply(value=value)}')
print(f'Subtract result is {cls.subtract(value=value)}')
你可以试试这个:
class Calculation:
DIVIDE_FACTOR = 2
MULTIPLY_FACTOR = 5
SUBTRACT_FACTOR = 10
@staticmethod
def divide(value):
return value / Calculation.DIVIDE_FACTOR
@staticmethod
def multiply(value):
return value * Calculation.MULTIPLY_FACTOR
@staticmethod
def subtract(value):
return value - Calculation.SUBTRACT_FACTOR
@classmethod
def grand_calculation(cls, value):
divide_result = cls.divide(value)
multiply_result = cls.multiply(value)
subtract_result = cls.subtract(value)
print(f"Divide result is {divide_result}")
print(f"Multiply result is {multiply_result}")
print(f"Subtract result is {subtract_result}")
这样一个测试用例的输出:
calculation = Calculation()
calculation.grand_calculation(20)
会是:
Divide result is 10.0
Multiply result is 100
Subtract result is 10
如果实例化类,您的示例将不起作用,因为您需要显式声明静态类方法:
class Calculation:
@staticmethod
def divide(value: float) -> float
...
否则
value
将在运行时绑定到实例(self
)。
考虑到这一点,问题得到了回答:如果您需要对课程的引用,请使用
classmethod
。如果你不打算实例化这个类,你可能根本不需要一个类。
我意识到这个例子是人为的,但我希望这些变量在任何情况下都存在于一个实例上。