如何在Python中访问基类的成员?

3 投票
2 回答
7254 浏览
提问于 2025-04-17 06:37

考虑以下的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会继续在每个基类中搜索这个属性。

撰写回答