需要访问类变量时应该使用classmethod吗?

问题描述 投票:0回答:2

很明显,下面是我从屁股里拿出来的一个非常简单的例子,但我只是想了解一下是否应该在这些类型的实例中使用@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)}')
python class-method
2个回答
0
投票

你可以试试这个:

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

0
投票

如果实例化类,您的示例将不起作用,因为您需要显式声明静态类方法:

class Calculation:
    @staticmethod
    def divide(value: float) -> float
        ...

否则

value
将在运行时绑定到实例(
self
)。

考虑到这一点,问题得到了回答:如果您需要对课程的引用,请使用

classmethod
。如果你不打算实例化这个类,你可能根本不需要一个类。

我意识到这个例子是人为的,但我希望这些变量在任何情况下都存在于一个实例上。

© www.soinside.com 2019 - 2024. All rights reserved.