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

6

我有类似这样的东西

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类变量吗?除了写__a,还有其他方法吗?(我猜答案可能非常简短:是的 :))


1
你使用双下划线属性名称的原因是什么?一个下划线不足以表示“私有”属性吗? - Gary Kerr
那就是Python专家需要回答的问题了... - fuenfundachtzig
3个回答

11

所以,__a不是一个静态的变量,它是一个类变量。由于有双下划线开头,它是一个被名称改写的变量。也就是说,为了使其伪私有,它会自动重命名为_<classname>__<variablename>而不是__<variablename>。它仍然可以通过该类的实例访问为__<variablename>,子类不会得到这种特殊处理。

我建议不要使用双下划线作为变量名前缀,只需使用单下划线来标记它是私有的,并避免名称改写。


3

将其称为 A._A__a。在Python中,类定义中出现的带有__前缀的符号将以_<class-name>为前缀,以使它们有点像“私有”。因此,在B的定义中出现的A.__a引用是一个对A._B__a的引用,这并不直观:

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

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


应该是 def getA(): return A.__a - darelf
哎呀,是真的。我会改正的。还要注意一下,我的示例类名是MyClass。;) - Andrei Sosnin
哎呀,我想我喜欢把错误叠在错误之上... :) - darelf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接