为什么我不能在Python中访问超类的私有变量?

Eya*_*yal 5 python subclass private-members python-3.x

我知道我应该使用访问方法.我在datetime模块中看到该类datetime继承自date.

class datetime(date):
    <some other code here....>
    self = date.__new__(cls, year, month, day)
    self._hour = hour
    self._minute = minute
    self._second = second
    self._microsecond = microsecond
    self._tzinfo = tzinfo
    return self
Run Code Online (Sandbox Code Playgroud)

我还看到datetime能够访问date的成员,如__repr__:

def __repr__(self):
    """Convert to formal string, for repr()."""
    L = [self._year, self._month, self._day, # These are never zero
         self._hour, self._minute, self._second, self._microsecond]
Run Code Online (Sandbox Code Playgroud)

我试图将datetime子类化为其添加一些信息,然后编写一个类似的__repr__函数:

def __repr__(self):
    """Convert to formal string, for repr()."""
    L = [self._year, self._month, self._day, # These are never zero
         self._hour, self._minute, self._second, self._microsecond,
         self._latitude, self._longitude]
Run Code Online (Sandbox Code Playgroud)

调试器抱怨self._year不存在.(self.year然而,工作.)

我知道我应该使用访问功能.我只想了解为什么datetime能够访问私有变量date但我的子类不能.

mat*_*ata 4

如果你看一下 的结尾datetime.py你会看到这个:

try:
    from _datetime import *
except ImportError:
    pass
Run Code Online (Sandbox Code Playgroud)

除其他外,这会导入先前定义的 python 类的 C 版本,因此将使用这些类,并且这些类没有您要访问的成员。

  • 的确。您不能访问它们,因为它们是私有的,而不是它们不存在于他正在使用的实现中。这就是为什么它们被“指示”为私有的 - 它们是实现细节,不保证存在。 (2认同)
  • @TryPyPy - 是的,当然这是可能的(有点困难),据我了解,使用访问器不是问题,因为它只是关于表示 - 并理解为什么类与预期不同。 (2认同)