classmethod内置函数 - 无法理解文档中的语句

时间:2012-10-09 08:37:02

标签: python

classmethod()第2章本身的Python Standard Library内置函数中,我对这两个语句感到困惑,我在这里引用: -

  

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

好的,直到这一部分我很清楚,classmethod特定于一个类,所以,不是将self作为隐式参数,它代表该类的一个实例,使用表示类本身的cls,并将classmethod绑定到类中。

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

  

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

现在,这意味着什么?是否试图说,在这种情况下使用时,我们实际上会将an object传递给classmethod?但这不是第一个声明本身的矛盾。

任何人都可以让我理解,这两个陈述是如何相互对立而不相互矛盾的?

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

2 个答案:

答案 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