Python中_x,__x和__x__的區別


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

希望能幫助到各位!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM