我想了解类继承如何在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,它可以防止继承类中的名称冲突,而不是阻止访问。另外,我希望你意识到你正在定义*类级变量*,相当于其他语言中的“静态变量”,而不是实例变量。 –
我认为值得加上这个澄清作为一个答案,因为这是一个很好的问题与不同背景的人来。 –