【问题标题】:Use of @classmethod in Python besides creating an alternate constructor除了创建备用构造函数之外,在 Python 中使用 @classmethod
【发布时间】:2018-06-02 07:14:15
【问题描述】:

除了创建一个“重载”(我猜不是真的重载,因为方法名称与 init 不同)构造函数之外,我还试图考虑 @classmethod 特殊装饰器的用例,但不能什么都想不到。

我查看了 What's an example use case for a Python classmethod? 之类的帖子,但只能找到指向备用构造函数的用例。

我能想到的另一种情况是将方法与类耦合以封装相关逻辑(如上面链接的帖子中的@samplebias 所述),但我认为@staticmethod 更适合将相关逻辑封装到类中(正如有人评论@samplebias 的帖子)。

谁能帮我确定这个特殊装饰器的一些其他用例吗?

【问题讨论】:

  • 我只将它用于替代构造函数。我从未使用过@staticmethod
  • 如果我有一个基类和 4 个从基类继承的子类,我想根据调用方法的子类修改流程逻辑或更改部分流程逻辑。然后我需要调用此方法的(子)类。然后我需要classmethod。
  • 另一个用例可能是为新实例设置默认值(例如,对于与网络相关的内容,您可能希望设置默认超时、默认主机等)。您可以通过设置类的属性来做到这一点,但如果想要一次设置多个属性是很常见的,那么类方法可能会很方便。
  • 嗯...所以基本上是我们想要定义一个修改类属性的方法的情况?我认为这是有道理的,因为静态方法并不是真的要改变类?
  • 静态方法不能改变类,因为它们没有得到对它的引用。 (嗯,他们可以通过类的名称,但这会破坏继承。)

标签: python python-decorators


【解决方案1】:

我正在使用 Python 浏览一些关于 OOP 的材料,并发现了 @classmethod 装饰器的用例,除了作为重载构造函数。

在直接作用于(改变)类对象时使用类方法是有意义的。例如,如果您有一个 Employee 对象和 base_raise_factor 作为类变量,则在 Employee 上创建一个类方法来更改此变量是有意义的。

您可能会争辩说我们可以直接将Employee.base_raise_factor 设置为某个值,但我认为最好坚持encapsulation 而不要直接修改内部结构。另外,我们可以在更新base_raise_factor的类方法中定义一些额外的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 2018-02-20
    • 2021-03-18
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2022-08-11
    • 2016-07-16
    相关资源
    最近更新 更多