我喜欢这样的
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
我可以访问__a
中的B
类变量吗?写a
代替__a
是可能的,这是唯一的方法吗? (我猜答案可能很简短:是的)。
答案 0 :(得分:7)
因此,__a
不是静态变量,它是一个类变量。由于双前导下划线,它是一个name mangled变量。也就是说,为了使其成为伪私有,它已被自动重命名为_<classname>__<variablename>
而不是__<variablename>
。它仍然可以通过只有的实例作为__<variablename>
来访问,子类不会得到这种特殊处理。
我建议你不要使用双前导下划线,只使用一个下划线来(a)标记它是私有的,以及(b)避免名称变形。
答案 1 :(得分:3)
请将其称为A._A__a
。在Python中,类定义中出现__
前缀的符号以_<class-name>
为前缀,使它们有点"private"。因此,A.__a
定义中出现的引用B
违反直觉,是对A._B__a
的引用:
>>> class Foo(object): _Bar__a = 42
...
>>> class Bar(object): a = Foo.__a
...
>>> Bar.a
42
答案 2 :(得分:1)
有Python装饰器@staticmethod
和@classmethod
,您可以使用它来声明静态或类相关的方法。这应该有助于访问您的类数据元素:
class MyClass:
__a = 0
@staticmethod
def getA():
return MyClass.__a
class MyOtherClass:
def DoSomething(self):
print MyClass.getA() + 1
受此来源启发的示例: http://www.rexx.com/~dkuhlman/python_101/python_101.html