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() 和 的值__x 有 10.
但是当我运行下面的代码:
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__x
,B.__x
变为 B._B__x
。这确保您不会意外地在子 class 中选择一个与您在 A
中的私有字段名称相似的字段。这就是名称重整存在的部分原因。
在第二种情况下,没有名称修改:您获得 B
中定义的 x
字段,class 您正在调用该方法。
根据我的理解,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() 和 的值__x 有 10.
但是当我运行下面的代码:
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__x
,B.__x
变为 B._B__x
。这确保您不会意外地在子 class 中选择一个与您在 A
中的私有字段名称相似的字段。这就是名称重整存在的部分原因。
在第二种情况下,没有名称修改:您获得 B
中定义的 x
字段,class 您正在调用该方法。