在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。;)哎呀,我想我喜欢把错误堆在错误之上……:)