实施例
如果我有这样的话:
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相互作用的情况下才有意义。期待它成为类。
答案 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中并没有破坏任何内容