49

前任。

如果我有这样的事情:

class C(object):
    @classmethod
    def f(cls, x):
       return x + x

这将起作用:

c = C()

c.f(2)
4

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

C.f()

或者

c.__class__.f()

显然,这只有在 f 不与 self/cls 交互并期望它是类的情况下才有意义。

?

4

6 回答 6

35

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

在示例中,由于您的最后一句话(没有 self/cls 交互),您给出的静态方法会更合适。

class C(object):
    @staticmethod
    def f(x):
       return x + x

这样,两者兼而有之是“好形式”

c = C()
c.f(2)

C.f(2)
于 2009-03-28T07:35:40.223 回答
13

我不记得在类外部使用过这样的类方法,但实例方法可以在其自身上调用类方法(例如,类方法在self.foo()哪里foo)。这确保了继承按预期进行,并将调用.foo()正确的子类而不是基类。

于 2009-03-28T04:28:11.750 回答
6

它主要只是令人困惑的外观。如果我在使用你的课程并看到这个,我会想知道那里还有什么其他惊喜,它看起来像是糟糕的设计。

它不仅仅是一个静态方法有什么原因吗?

于 2009-03-28T02:29:35.670 回答
3

C.f()比 更清晰c_instance.f(),而且c_instance.__class__.f()丑陋。由于清晰和美丽是 python 社区中深受喜爱的特性,我倾向于说 Cf() 是最好的方法。

您是否有任何特殊原因甚至想以其他任何一种方式调用它?

于 2009-03-28T02:31:12.123 回答
2

如果您已经有 C 的实例,为什么需要 f() 作为类方法?它不仅形式不好,而且通常没有必要。网上有人说:“这很糟糕,因为它给人的印象是使用了对象中的某些实例变量,但事实并非如此。”

虽然,学习 python的第 484 页指出,您可以以任何一种方式调用该方法,只要您传入相同的实例,它就会完全相同。

于 2009-03-28T02:41:35.813 回答
1

我遇到了这个问题,我正在从非类方法调用一些类方法(需要是类方法,以便我仍然可以引用该类),如下所示。

class A:
  def a(self, number):
    print("a", self, number)
    self.b(number)

  @classmethod
  def b(cls, number):
    print("b", cls, number + 1)
    cls.c(number)

  @classmethod
  def c(cls, number):
    print("c", cls, number * 2)



b = A()
b.a(3) 

上面的代码产生以下结果:

a <__main__.A object at 0x000001FAC09FE358> 3
b <class '__main__.A'> 4
c <class '__main__.A'> 6

我并不是说这是最好的约定,但它不会破坏 Python 3.6 中的任何内容

于 2018-10-11T16:49:07.380 回答