python中class方法的第一个参数是什么?

What is the first parameter of class methods in python?

根据我的理解,class 方法中传递的第一个参数是 class 本身,其中定义了 class 方法。因此,例如,考虑以下代码:

class A(object):
    __x=10

    @classmethod
    def clam(cls,*args):
        print(cls.__x)

class B(A):
    __x=50

当我打电话时:

B.clam()

输出是 10 根据我的理解这是可以的因为被调用的 class 方法定义在 class A ,所以 class A 将隐式传递给 clam() 的值__x10.

但是当我运行下面的代码:

class A(object):
    x=10

    @classmethod
    def clam(cls,*args):
        print(cls.x)

class B(A):
    x=50

当我打电话时:

 B.clam()

我的生活突然毁了。输出为 50

这两种情况的唯一区别是前一种情况下 x 是私有的。

到底发生了什么?为什么后一个的输出是 50 ?是否有任何范围更改或突然传递给 A 中定义的 class 方法的第一个参数变为 class B

class 方法中的第一个参数是您调用该方法的 class,而不是(必须)定义该方法的 class。 (拥有一个始终保持相同 class 的变量可能没有那么有用。)

在第一种情况下,名称修改会区分这两个字段,以防止您意外隐藏子class 中的私有变量。字段 A.__x 变为 A._A__xB.__x 变为 B._B__x。这确保您不会意外地在子 class 中选择一个与您在 A 中的私有字段名称相似的字段。这就是名称重整存在的部分原因。

在第二种情况下,没有名称修改:您获得 B 中定义的 x 字段,class 您正在调用该方法。