为什么要使用类方法而不是静态方法?

42 浏览
0 Comments

为什么要使用类方法而不是静态方法?

这个问题已经有了答案:
静态方法和类方法的区别

我知道它们的作用,并且我已经看过许多两者的例子,但是我没有找到一个单独使用 staticmethod 无法替代 classmethod 的例子。

我看到 classmethod 最常见的例子是用于创建类本身的新实例,像这样(非常简化的示例,目前该方法没有用处,但你可以理解):

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

当调用 foo = Foo.create_new() 时,这将返回 Foo 的一个新实例。那么为什么我不能只使用这个呢:

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

它完全相同,为什么我应该使用 classmethod 而不是 staticmethod

0
0 Comments

是的,这两个类将执行相同的操作。

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

class Bar (Foo):
    pass

现在调用 Bar.create_new 会产生不同的结果。对于静态方法,您会得到一个 Foo。对于类方法,您会得到一个 Bar

因此,重要的区别在于类方法将类型作为参数传递。

0
0 Comments

在您的示例中,差别很小,但是假设您创建了 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()

...因此选择将取决于您想要的行为。

0