在classmethod()第2章本身的Python Standard Library内置函数中,我对这两个语句感到困惑,我在这里引用: -
一个类方法只接受类作为隐式的第一个参数 就像实例方法接收实例一样。
好的,直到这一部分我很清楚,classmethod
特定于一个类,所以,不是将self
作为隐式参数,它代表该类的一个实例,使用表示类本身的cls
,并将classmethod
绑定到类中。
现在,这是本主题后面的另一个声明让我感到困惑: -
如果为派生类调用类方法,则派生类 object作为隐含的第一个参数传递。
现在,这意味着什么?是否试图说,在这种情况下使用时,我们实际上会将an object
传递给classmethod
?但这不是第一个声明本身的矛盾。
任何人都可以让我理解,这两个陈述是如何相互对立而不相互矛盾的?
我试图找出一些资源,但找不到example
,展示了second case
..
答案 0 :(得分:4)
类是一个功能齐全的第一类对象,就像该类的实例一样(尽管它们显然不是同一个对象)。当我们说classmethod
class C
接收“class object”作为第一个参数时,我们说它接收一个表示a的对象,而不是isinstance(<the object>, C)
为真的对象。后者称为(类)实例,“类对象”是为 类的对象保留的。
第二句简单地阐明了如果在派生类上调用类方法,则类方法接收该派生类(AKA“派生类对象”),以启用多态行为。例如(Python 3,因为f..k旧样式类):
class C:
x = 1
@classmethod
def m(cls):
return cls.x
class D(C):
x = 2
print(C.m()) # 1
print(D.m()) # 2
答案 1 :(得分:2)
class A(object):
@classmethod
def x(cls): return cls
class B(A):
pass
print B().x()
在此,我通过其子类A.x()
调用B
。
因此,返回从B
派生的类对象A
。