接下來本人就: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內建的屬性方法,最好不要在外部調用,也稱為魔法方法。
希望能幫助到各位!