在python中通过self公开的类级变量
这显然有限制,其中,I obj将不具有名为“A”的属性。但是为什么python通过在python中通过self公开的类级变量,python,Python,这显然有限制,其中,I obj将不具有名为“A”的属性。但是为什么python通过self.A公开“A”。将其作为ClassA.A返回是否更好?这完全是出于设计 类上的方法也是类上的属性(尽管也通过被增强)。这也是self.methodA()的定位方式 Python首先在实例上搜索属性,然后是类,然后是类的基类 请注意,设置self.A仍将设置实例上的值,从而屏蔽class属性。这允许类为属性指定默认值,稍后由实例上的值替换 这并不妨碍您直接访问ClassA.A并绕过实例字典。如果您想更改共享值
self.A
公开“A”。将其作为ClassA.A
返回是否更好?这完全是出于设计
类上的方法也是类上的属性(尽管也通过被增强)。这也是self.methodA()
的定位方式
Python首先在实例上搜索属性,然后是类,然后是类的基类
请注意,设置self.A
仍将设置实例上的值,从而屏蔽class属性。这允许类为属性指定默认值,稍后由实例上的值替换
这并不妨碍您直接访问
ClassA.A
并绕过实例字典。如果您想更改共享值,出于上述原因,您必须直接将其分配给ClassA.A
。只是一个提示-如果您使用的是Python 3.x(我认为您是),那么您不需要让您的类从对象继承。您只是在Python2.x中这样做的,所以它们将成为“新样式”类。然而,在Python3.x中,所有类都是“新样式”。谢谢@iCodez。同意并更正。我明白了。有道理。让类作为self.a vs ClassA.a返回它有什么限制?我认为这有助于读者理解语义。@SenthilKumaran:当然,你仍然可以这样做;明确表示您使用的是共享值。重要的区别在于,如果您将其作为self.a
返回,则子类可以覆盖它,并且正如Martijn所说,实例可以具有不同于类属性的自己的值。如果将其返回为ClassA.A
,则显式忽略对象或任何子类的特定内容。因此,您需要确定这在逻辑上是Python碰巧通过对象使其可访问的全局值,还是Python碰巧允许您为其设置类范围默认值的实例属性。这会告诉你该做什么。谢谢你在这个@MartijnPieters上给我们的启示
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