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内建的属性方法,最好不要在外部调用,也称为魔法方法。

希望能帮助到各位!

原文地址:https://www.cnblogs.com/xcbb/p/14644160.html