考虑以下python代码
class Base(object):
def __init__(self):
self.foo = 5
class Derived(Base):
def __init__(self):
Base.__init__(self)
self.foo = 6
bar = Base()
print bar.foo
foobar = Derived()
print foobar.foo
我可以从foobar访问基类中的foo吗?在C ++中我们可以使用Base ::,那么Python呢?任何简单的方法? 感谢
答案 0 :(得分:2)
不,没有办法访问它,因为该属性被覆盖。这些类共享相同的__dict__
存储。
如果你想避免在子类中使用同名的私有属性发生冲突,你可以使用self.__foo
,它将扩展为self._ClassName__foo
,但你通常不需要它。
答案 1 :(得分:1)
您可以使用类属性而不是实例属性来执行此操作:
class Base(object):
foo = 5
class Derived(Base):
"""A class derived from Base.
>>> bar = Base()
>>> print bar.foo
5
>>> foobar = Derived()
>>> print foobar.foo
6
>>> print foobar.__class__.__base__.foo
5
>>> foobar.__class__.__base__.foo = 7
>>> bar.foo
7
"""
foo = 6
理解这种区别非常重要。您的问题中的代码创建了一些类,在实例化时,授予新创建的foo
实例属性等于5或6.另一方面,此代码创建类本身的foo
属性可以从任何实例访问。
这实际上是通过为每个实例使用字典和为每个祖先类使用另一个字典来实现的。如果Python在实例字典中没有找到请求的属性,它会在类字典中查找该实例;如果在那里找不到它,Python将继续在每个基类中搜索该属性。