我们定义一个类:(不难,望读者细心阅之)
class Student(): # 类名规定:每个单词首字母大写 def __init__(self, name, age): # 初始化 self.name = name self.age= age def get_age(self): return self._age() def _name(self): pass # 此时 _name为 类 Student的私有方法
上述代码中出现了 __init__
和 _name
两个方法
__init__
是一个Python的魔术方法,它是内建的方法,这个方法负责初始化Python类的实例,还有很多魔术方法,比如__len__
、__new__
等等。_name
是一个私有的方法,Python 在规范中说明了私有方法或私有变量以单个 _
开头。为了解释__x,我们不妨再定义一个继承类:(不难,望读者细心阅之)
class StudentA(): def __init__(self, name): self.__name = "studenta_name" class StudentB(): def __init__(self, name): self.__name = "studentb_name" class StudentC(StudentA, StudentB): # 多继承 def __init__(self, name): StudentA.__init__(self, name) StudentB.__init__(self, name) self.__name = name c = StudentC("studentc_name") print(c.__dict__) # {‘_StudentA__name‘: ‘studenta_name‘, ‘_StudentB__name‘: ‘studentb_name‘, ‘_StudentC__name‘: ‘studentc_name‘} print(c.__name) # AttributeError: ‘StudentC‘ object has no attribute ‘__name‘
上面代码中定义了两个类StudentA和StudentB,且类StudentC多继承于StudentA和StudentB。
并且StudentA、StudentB和StudentC三个类都有一个同名的实例变量 __name
。
由于在继承体系中可能存在同名的变量,因此需要加以区分。
注意观察可以发现,在类继承中,以 __ 开头
,至多一个_
结尾的变量在子类中会被改写为_{class_name}__{variable_name}
。
在上例中,类StudentA的__name
在子类StudentC中被改写为_StudentA__name
,类StudentB的__name
在子类StudentC中被改写为_StudentB__name
,类StudentC的__name
在子类StudentC中被改写为_StudentC__name
。这样做可以有效避免类继承的情况下同名变量无法被区分的情况。
希望能帮助到各位!
原文:https://www.cnblogs.com/xcbb/p/14644160.html