Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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中访问父类的静态类变量_Python_Class_Inheritance_Static Variables - Fatal编程技术网

在Python中访问父类的静态类变量

在Python中访问父类的静态类变量,python,class,inheritance,static-variables,Python,Class,Inheritance,Static Variables,我有这样的东西 class A: __a = 0 def __init__(self): A.__a = A.__a + 1 def a(self): return A.__a class B(A): def __init__(self): # how can I access / modify A.__a here? A.__a = A.__a + 1 # does not work def a(self): return A.__

我有这样的东西

class A:
  __a = 0
  def __init__(self):
    A.__a = A.__a + 1
  def a(self):
    return A.__a

class B(A):
  def __init__(self):
    # how can I access / modify A.__a here?
    A.__a = A.__a + 1 # does not work
  def a(self):
    return A.__a

我可以访问
B
中的
类变量吗?写
a
而不是
\uu a
是可能的,这是唯一的方法吗?(我想答案可能相当简短:是:)

将其称为
A.。\u A\u A
。在Python中,类定义中带有
\uuuu
前缀的符号以
\uuu
作为前缀,使它们在某种程度上更为复杂。因此,在
B
的定义中出现的
A.\uuuu A
的引用是对
A.\uu B\uu A
的反直觉引用:

>>> class Foo(object): _Bar__a = 42
... 
>>> class Bar(object): a = Foo.__a
... 
>>> Bar.a
42

有Python修饰符
@staticmethod
@classmethod
,您可以使用它们来声明静态或与类相关的方法。这将有助于访问类数据元素:

class MyClass:
     __a = 0

     @staticmethod
     def getA():
         return MyClass.__a

class MyOtherClass:

     def DoSomething(self):
         print MyClass.getA() + 1
受此来源启发的示例:
所以,
\u a
不是一个静态变量,它是一个类变量。由于双前导下划线,它是一个变量。也就是说,为了使它成为伪私有的,它被自动重命名为
\uuuuuuuu
,而不是
\uuuuuuu
。该类的实例仍然只能在
\uuu
时访问它,子类不会得到这种特殊处理


我建议您不要使用双前导下划线,只使用一个下划线来(a)标记它是私有的,以及(b)避免名称混乱。

使用双下划线属性名称的原因是什么?一个下划线是否不足-用于指示“private”属性?这是Python专家需要回答的问题…应该是def getA():返回a.。u aOops,true。我会改正的。还要注意,在我的示例中,类名是MyClass。;)哎呀,我想我喜欢把错误堆在错误之上……:)