从类实例中调用classmethod作为方法是不好的形式?

Jos*_*son 35 python class-method

防爆.

如果我有这样的事情:

class C(object):
    @classmethod
    def f(cls, x):
       return x + x
Run Code Online (Sandbox Code Playgroud)

这将有效:

c = C()

c.f(2)
4
Run Code Online (Sandbox Code Playgroud)

但这是不好的形式?我应该只打电话

C.f()
Run Code Online (Sandbox Code Playgroud)

要么

c.__class__.f()
Run Code Online (Sandbox Code Playgroud)

显然,这只有在f不与self/cls相互作用的情况下才有意义.

Ton*_*uža 31

如果您想从实例调用类方法,则可能不需要类方法.

在这个例子中,你给出一个静态方法更合适,因为你的最后一句话(没有自我/ cls交互).

class C(object):
    @staticmethod
    def f(x):
       return x + x
Run Code Online (Sandbox Code Playgroud)

这样做两者都是"好形式"

c = C()
c.f(2)
Run Code Online (Sandbox Code Playgroud)

C.f(2)
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是如果你真的需要一个类方法呢? (6认同)

Mat*_*ood 10

我不记得在类之外使用这样的类方法,但是实例方法可以自己调用类方法(例如self.foo(),在哪里foo是类方法).这可以确保继承按预期方式执行,并将调用.foo()正确的子类而不是基类.


Tre*_*out 5

这主要是看起来令人困惑.如果我正在使用你的课程并看到这一点,它会让我想知道其他的惊喜是什么,它看起来像是糟糕的设计.

有没有理由这不仅仅是一种静态方法?