【发布时间】:2014-12-06 18:27:51
【问题描述】:
嗯,我有几乎相同的question,除了一个细节:我需要获取基类的私有值。代码:
class Parent(object):
def __init__(self):
self.__field = 13
class Child(Parent):
"""docstring for Child"""
def __init__(self):
super(Child, self).__init__()
def ChildMethodWhichUsingParentField(self):
return self.__field
if __name__ == '__main__':
c = Child()
c.ChildMethodWhichUsingParentField()
解释器输出:
Traceback (most recent call last):
File "foo.py", line 20, in <module>
c.ChildMethodWhichUsingParentField()
File "foo.py", line 16, in ChildMethodWhichUsingParentField
return self.__field
AttributeError: 'Child' object has no attribute '_Child__field'
问题是解释器在我需要_Parent__field 时尝试获取_Child__field。我可以使用@property 获得这个值,但它会破坏封装。我也可以写self._Parent__field 来解决这个问题,但这是丑陋且显然是糟糕的代码。还有其他方法吗?
【问题讨论】:
-
为什么不停止在
field前加上两个下划线? -
单下划线是要走的路,用于自定义“私有”类成员。
-
@jonrsharpe,因为这会破坏封装。
field很重要,仅供内部使用。我想确保没有人可以看到和/或修改field。 -
@Montreal 这并没有做到这一点 - Python 没有私有属性,我们在这里都是同意的成年人。双下划线只是调用名称修饰,这不会阻止故意的外部访问并使必要的访问变得痛苦(正如您所经历的那样)。如果它应该被认为是私有的,一个下划线就足够了。名称修改只是为了避免冲突,请参阅legacy.python.org/dev/peps/pep-0008/#naming-conventions。 (此外,在这种情况下,它是 "break"。)
-
@jonrsharpe 我知道,但我对我最喜欢的语言的这一方面感到有点失望。
标签: python oop inheritance