如何在Python中访问基类的成员?
考虑以下的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中呢?有没有简单的方法?谢谢
2 个回答
2
不,这个属性是被覆盖了,所以没有办法访问。不同的类共享同一个 __dict__
存储空间。
如果你想避免在子类中出现同名的私有属性冲突,可以使用 self.__foo
,这样它会变成 self._ClassName__foo
,不过通常情况下你不需要这样做。
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会继续在每个基类中搜索这个属性。