接下来本人就:Python中 _x, __x 和 __x__ 之间的区别与大家分享一下。
我们定义一个类:(不难,望读者细心阅之)
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
。这样做可以有效避免类继承的情况下同名变量无法被区分的情况。
总结:
- _x:约定的私有变量命名规范
- __x或者__x_:为了避免在继承中命名冲突而起的变量名,将被改写为_{类名}__{变量名}
- __x__:是Python内建的属性方法,最好不要在外部调用,也称为魔法方法。
希望能帮助到各位!