Python類沒有public/private的概念,所以我們被告知不要觸及以下劃線開頭的東西,除非我們創建它。但是這並不需要我們直接或間接繼承的所有類的完整知識嗎?證人:Python是否需要繼承鏈中所有類的知識?
class Base(object):
def __init__(self):
super(Base, self).__init__()
self._foo = 0
def foo(self):
return self._foo + 1
class Sub(Base):
def __init__(self):
super(Sub, self).__init__()
self._foo = None
Sub().foo()
預期地,當None + 1
被評估TypeError
上升。所以我必須知道_foo
存在於基類中。爲了解決這個問題,__foo
可以用來代替,它通過改變名稱來解決問題。這似乎是一種可以接受的解決方案,如果不是優雅的話。然而,如果Base
繼承自一個名爲Sub
的類(在單獨的包中)會發生什麼?現在__foo
在我的Sub
中重寫__foo
在祖父母Sub
中。
這意味着我必須知道整個繼承鏈,包括每個使用的所有「私有」對象。 Python是動態類型的這一事實使得這更加困難,因爲沒有聲明來搜索。然而,最糟糕的部分可能是Base
現在可能繼承object
的事實,但在未來的某個版本中,它將切換爲從Sub
繼承。很顯然,如果我知道Sub
是從繼承的,我可以重命名我的班級,然而令人討厭的是。但我看不到未來。
這不是真正的私人數據類型可以防止問題的情況嗎?在Python中,如果這些腳趾可能會在未來某個時刻出現,我是否可以確定我不會意外踩到某人的腳趾?
編輯:我顯然沒有說清楚主要問題。我熟悉名稱的改變以及單個和雙下劃線之間的區別。問題是:我該如何處理這樣的事實,即我可能會碰到類別,這些類別的存在我現在不知道?如果我的父類(它在一個我沒有寫的包中)碰巧開始從與我的類同名的類繼承,即使名稱修改也無濟於事。我認爲這是一個真正的私人成員可以解決的(角落)情況,但我認爲Python有問題嗎?
編輯:按照要求,下面是一個完整的例子:
文件parent.py
:
class Sub(object):
def __init__(self):
self.__foo = 12
def foo(self):
return self.__foo + 1
class Base(Sub):
pass
文件sub.py
:
import parent
class Sub(parent.Base):
def __init__(self):
super(Sub, self).__init__()
self.__foo = None
Sub().foo()
祖父母的foo
叫,但我使用__foo
。
顯然你不會自己寫這樣的代碼,但parent
可以很容易地由第三方提供,其細節可以在任何時候改變。
你可以發佈一個例子來演示這個地方其他同名的類不會完全影響你現有的類嗎..或者我還是不明白..nevermind ...我做了一個和你的權利我猜這是一個角落case ...只是儘量不要使用常見的私人var /類名稱我猜 – 2012-07-24 22:04:01