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

时间:2009-03-28 02:21:05

标签: python class-method

实施例

如果我有这样的话:

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相互作用的情况下才有意义。期待它成为类。

6 个答案:

答案 0 :(得分:31)

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

在示例中,您提供的静态方法更合适,因为您的上次评论(没有自我/ cls交互)。

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

这样做两种“好形式”

c = C()
c.f(2)

C.f(2)

答案 1 :(得分:10)

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

答案 2 :(得分:5)

主要是看起来很混乱。如果我正在使用你的课程并看到这个,它会让我想知道那里有什么其他的惊喜,它看起来就像糟糕的设计。

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

答案 3 :(得分:3)

C.f()c_instance.f()更清晰,c_instance.__class__.f()只是丑陋。由于蟒蛇社区的清晰度和美感是非常受欢迎的特征,我倾向于说C.f()是最好的路线。

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

答案 4 :(得分:3)

如果你已经有一个C实例,你为什么需要f()作为一个类方法?它不仅形式不好,通常也没有必要。网上有人说:“这很糟糕,因为它会造成使用对象中的某些实例变量的印象,但情况并非如此。”

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

答案 5 :(得分:0)

我碰到了这种情况,我在从非类方法中调用一些类方法(需要是类方法,以便我仍然可以引用该类),如下所示。

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中并没有破坏任何内容