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

时间:2010-06-18 14:39:51

标签: 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.__a

我可以访问__a中的B类变量吗?写a代替__a是可能的,这是唯一的方法吗? (我猜答案可能很简短:是的)。

3 个答案:

答案 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