【问题标题】:Why use classmethod instead of staticmethod? [duplicate]为什么使用 classmethod 而不是 staticmethod? [复制]
【发布时间】:2013-04-16 20:00:39
【问题描述】:

我知道他们在做什么,并且我已经看到了很多这两种方法的例子,但我还没有找到一个我必须使用 classmethod 而不是用 staticmethod 替换它的例子。

我见过的classmethod最常见的例子是为类本身创建一个新实例,像这样(非常简单的例子,没有使用atm方法。但是你明白了):

class Foo:
    @classmethod
    def create_new(cls):
        return cls()

这将在调用foo = Foo.create_new() 时返回Foo 的新实例。 现在为什么我不能只使用它:

class Foo:
    @staticmethod
    def create_new():
        return Foo()

完全一样,我为什么要使用classmethod 而不是staticmethod

【问题讨论】:

    标签: python class python-3.x static-methods class-method


    【解决方案1】:

    您的示例几乎没有区别,但假设您创建了Foo 的子类并在子类上调用了create_new 方法...

    class Bar(Foo):
        pass
    
    obj = Bar.create_new()
    

    ...那么这个基类将导致创建一个新的Bar 对象...

    class Foo:
        @classmethod
        def create_new(cls):
            return cls()
    

    ...而这个基类会导致创建一个新的Foo 对象...

    class Foo:
        @staticmethod
        def create_new():
            return Foo()
    

    ...所以选择取决于您想要的行为。

    【讨论】:

      【解决方案2】:

      docs 开始,类方法接收其类作为隐式参数,而静态方法不知道它们所在的类。

      这在您有一个继承的静态方法想要用子类中的不同行为覆盖的情况下很有用。

      【讨论】:

        【解决方案3】:

        是的,这两个类会做同样的事情。

        但是,现在想象一下该类的子类型:

        class Bar (Foo):
            pass
        

        现在调用Bar.create_new 会有所不同。对于静态方法,您会得到一个Foo。对于类方法,你会得到一个Bar

        所以重要的区别是类方法获取作为参数传递的类型。

        【讨论】:

          猜你喜欢
          • 2019-08-14
          • 2012-08-24
          • 2019-01-13
          • 2018-03-30
          • 2021-08-14
          • 2021-02-06
          • 1970-01-01
          • 2015-07-14
          相关资源
          最近更新 更多