2011-11-18 38 views
1

考慮下面的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 

我可以訪問foo的基類從foobar的。在C++中,我們可以使用Base ::,Python怎麼樣?任何簡單的方法? 謝謝

回答

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 

理解的區別是很重要的。您的問題中的代碼創建的類在實例化時授予等於5或6的新創建的foo實例屬性。另一方面,此代碼創建可從其任何實例訪問的類本身的foo屬性。

這實際上是通過使用每個實例的字典和每個祖先類的另一個字典來實現的。如果Python在實例字典中未找到請求的屬性,它將在該類實例的類字典中查找;如果在那裏找不到,Python將繼續搜索每個基類的屬性。

2

不,沒有辦法訪問它,因爲該屬性被覆蓋。這些類共享相同的__dict__存儲。

如果你想避免在子類中衝突相同名稱的私有屬性,你可以使用self.__foo,這將擴大到self._ClassName__foo,但你通常不應該需要。