我想了解類繼承如何在Python 3中工作,特別是私人領域如何與本地和繼承方法進行交互。這裏有一些例子來說明這個問題。Python3:類繼承和私有字段
首先,如果在超類的變量var
是公共的,然後在子類中的任何方法也可以改變它:
class Superclass:
var = 1
def getVar(self):
print(self.var)
class Subclass(Superclass):
def __init__(self):
self.var = 123
my_object = Subclass()
my_object.getVar() # outputs 123
同樣是不正確的,如果在超類中的變量__var
是私人,任何繼承的方法將忽略由子類進行修改:
class Superclass:
__var = 1
def getVar(self):
print(self.__var)
class Subclass(Superclass):
def __init__(self):
self.__var = 123
my_object = Subclass()
my_object.getVar() # outputs 1!
子類中的本地方法可以修改它:
class Superclass:
__var = 1
class Subclass(Superclass):
def __init__(self):
self.__var = 123
def getVar(self):
print(self.__var)
my_object = Subclass()
my_object.getVar() # outputs 123
但爲了使用繼承的方法改變了其價值,我必須在子類中使用self._Superclass__var
代替self.__var
:
class Superclass:
__var = 1
def getVar(self):
print(self.__var)
class Subclass(Superclass):
def __init__(self):
self._Superclass__var = 123
my_object = Subclass()
my_object.getVar() # outputs 123
爲什麼會出現這種情況?是否私有字段不被子類繼承,因此Subclass
中的變量self.__var
不指向與Superclass
中的變量self.__var
相同的值?
Python中沒有專用字段。如果用'__'前綴屬性名稱,則會調用名稱修改,其中自動插入「擁有」類的名稱,以防止在子類中衝突屬性名稱。它並不妨礙你訪問它,它只是要求你包含擁有類的名字。請參閱https://docs.python.org/3/tutorial/classes.html#private-variables – kindall
Python中有*沒有專用字段*。這是你根本的誤解。您正在使用雙下劃線名稱mangling,它可以防止繼承類中的名稱衝突,而不是阻止訪問。另外,我希望你意識到你正在定義*類級變量*,相當於其他語言中的「靜態變量」,而不是實例變量。 –
我認爲值得加上這個澄清作爲一個答案,因爲這是一個很好的問題與不同背景的人來。 –