0

Python 标准库第 2 章本身的classmethod()内置函数下,我对这里引用的两个语句感到困惑:-

类方法接收类作为隐式第一个参数,就像实例方法接收实例一样。

好的,直到这一部分我已经足够清楚了,aclassmethod是特定于一个类的,所以,我们不使用表示self该类的实例的隐式参数,而是使用cls表示类本身并将其绑定classmethod到班级..

现在,这是本主题后面的另一个让我感到困惑的声明:-

如果为派生类调用类方法,则派生类对象作为隐含的第一个参数传递。

现在,这应该是什么意思?是不是想说,我们在这种情况下使用时实际上传递an object给 a classmethod?但这不与第一个陈述本身相矛盾。

谁能让我理解,这两个陈述如何在不相互矛盾的情况下齐头并进?

我试图找出一些资源,但找不到example,演示second case..

4

2 回答 2

4

一个类是一个功能齐全的一流对象,就像该类的实例一样(尽管它们显然不是同一个对象)。当我们说 a classmethodofclass C接收“类对象”作为第一个参数时,我们说它接收一个表示 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
于 2012-10-09T08:46:03.390 回答
2
class A(object):
    @classmethod
    def x(cls): return cls

class B(A):
    pass

print B().x()

在这里,我A.x()通过它的子类调用B

B因此,从 派生的类 objectA被返回。

于 2012-10-09T08:41:16.403 回答