Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中通过self公开的类级变量_Python - Fatal编程技术网

在python中通过self公开的类级变量

在python中通过self公开的类级变量,python,Python,这显然有限制,其中,I obj将不具有名为“A”的属性。但是为什么python通过self.A公开“A”。将其作为ClassA.A返回是否更好?这完全是出于设计 类上的方法也是类上的属性(尽管也通过被增强)。这也是self.methodA()的定位方式 Python首先在实例上搜索属性,然后是类,然后是类的基类 请注意,设置self.A仍将设置实例上的值,从而屏蔽class属性。这允许类为属性指定默认值,稍后由实例上的值替换 这并不妨碍您直接访问ClassA.A并绕过实例字典。如果您想更改共享值

这显然有限制,其中,I obj将不具有名为“A”的属性。但是为什么python通过
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