5

我有这样的东西

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,这是唯一的方法吗?(我想答案可能很短:是的:)

4

3 回答 3

10

所以,__a不是静态变量,而是类变量。由于双前导下划线,它是一个名称错位变量。也就是说,为了使其成为伪私有,它被自动重命名为_<classname>__<variablename>而不是__<variablename>. 它仍然只能被该类的实例访问,因为__<variablename>子类没有得到这种特殊处理。

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

于 2010-06-18T14:57:22.453 回答
3

将其称为A._A__a。在 Python 中,在类定义中出现前缀的符号带有__前缀,_<class-name>以使它们有点“私有”。因此,与直觉相反,A.__a出现在 的定义中的引用是对 的引用:BA._B__a

>>> class Foo(object): _Bar__a = 42
... 
>>> class Bar(object): a = Foo.__a
... 
>>> Bar.a
42
于 2010-06-18T14:45:48.013 回答
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

于 2010-06-18T14:48:30.867 回答