Use of @classmethod in Python besides creating an alternate constructor
除了创建一个"overloaded"(我猜不是真的重载,因为方法名与init不同)构造函数之外,我还尝试考虑@classmethod特殊修饰器的用例,但是我想不出任何。
我已经查看了类似于什么是Python类方法的示例用例这样的文章?但只能找到指向备用构造函数的用例。
我可以想到的另一种情况是将一个方法与一个用于封装相关逻辑的类结合在一起(正如上面链接的post中@samplebias提到的那样),但我认为@staticmethod更适合将相关逻辑封闭到类中(就像有人在@samplebias的post上评论的那样)。
有人能帮我为这个特殊的装饰器识别一些额外的用例吗?
- 我只在备用构造函数中使用过它。我从来没有用过@staticmethod
- 如果我有一个基类和4个子类从基继承,我想修改流逻辑或更改它的部分,根据这些部分调用方法的子类。然后我需要从中调用此方法的(子)类。然后我需要类方法。
- 另一个用例可能是为新实例设置默认值(例如,对于与网络相关的东西,您可能希望设置默认超时、默认主机等)。您可以通过设置类的属性来做到这一点,但是如果一次设置几个属性是很常见的,那么一个类方法可能很方便。
- 隐马尔可夫模型。。。所以基本上是一个我们想要定义一个修改类属性的方法的例子?我认为这是有意义的,因为静态方法实际上并不打算改变类?
- 静态方法无法更改类,因为它们没有获得对该类的引用。(好吧,它们可以通过类的名称,但这会破坏继承。)
- 啊,我明白了…所以也许我只需要确定一个上下文,在其中修改类对象?
我用python在oop上浏览了一些资料,发现了一个@classmethod装饰器的用例,除了作为一个重载的构造函数。
当直接对类对象执行(更改)操作时,使用类方法是有意义的。例如,如果您有一个Employee对象和一个base_raise_factor作为类变量,那么在Employee上创建一个类方法来更改这个变量是有意义的。
你可以说我们可以直接把Employee.base_raise_factor设置为某个东西,但我认为最好坚持encapsulation,而不是直接修改内部。另外,我们可以在更新base_raise_factor的类方法中定义一些额外的逻辑。