class ClassA:
A = 10
def __init__(self):
self.a = 10
self.b = 20
def methodA(self):
return self.A
obj = ClassA()
print(obj.methodA()) # returns 10
这明显具有限制,其中,obj将不具有名称“A”的属性。但是为什么python会通过self.A
暴露'A'。最好将其作为ClassA.A
返回吗?
答案 0 :(得分:3)
这完全是设计上的。
类上的方法也是类的属性(虽然也被descriptors增强)。这也是self.methodA()
的定位。
Python首先在实例上搜索属性,然后是类,然后是类的基类。
请注意,设置 self.A
仍会在实例上设置值,从而屏蔽class属性。这允许类指定属性的默认值,稍后将替换为实例上的值。
这一切并不妨碍您直接访问ClassA.A
并绕过实例字典。如果您想更改共享值,则必须由于上述原因直接分配给ClassA.A
。