前任。
如果我有这样的事情:
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 交互并期望它是类的情况下才有意义。
?
前任。
如果我有这样的事情:
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 交互并期望它是类的情况下才有意义。
?
如果您想从实例调用类方法,您可能不需要类方法。
在示例中,由于您的最后一句话(没有 self/cls 交互),您给出的静态方法会更合适。
class C(object):
@staticmethod
def f(x):
return x + x
这样,两者兼而有之是“好形式”
c = C()
c.f(2)
和
C.f(2)
我不记得在类外部使用过这样的类方法,但实例方法可以在其自身上调用类方法(例如,类方法在self.foo()
哪里foo
)。这确保了继承按预期进行,并将调用.foo()
正确的子类而不是基类。
它主要只是令人困惑的外观。如果我在使用你的课程并看到这个,我会想知道那里还有什么其他惊喜,它看起来像是糟糕的设计。
它不仅仅是一个静态方法有什么原因吗?
C.f()
比 更清晰c_instance.f()
,而且c_instance.__class__.f()
丑陋。由于清晰和美丽是 python 社区中深受喜爱的特性,我倾向于说 Cf() 是最好的方法。
您是否有任何特殊原因甚至想以其他任何一种方式调用它?
如果您已经有 C 的实例,为什么需要 f() 作为类方法?它不仅形式不好,而且通常没有必要。网上有人说:“这很糟糕,因为它给人的印象是使用了对象中的某些实例变量,但事实并非如此。”
虽然,学习 python的第 484 页指出,您可以以任何一种方式调用该方法,只要您传入相同的实例,它就会完全相同。
我遇到了这个问题,我正在从非类方法调用一些类方法(需要是类方法,以便我仍然可以引用该类),如下所示。
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 中的任何内容