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

    希望能帮助到各位!

  • 相关阅读:
    Jsp 中文乱码,解决
    dojox.grid.EnhancedGrid 和 dojox.grid.DataGrid 的继承关系
    使用 Maven 部署 artifact 到 Nexus 教程
    [LeetCode] 187. Repeated DNA Sequences 解题思路
    [LeetCode] 204. Count Primes 解题思路
    [LeetCode] 219. Contains Duplicate II 解题思路
    [LeetCode] 310. Minimum Height Trees 解题思路
    [LeetCode] 200. Number of Islands 解题思路
    PHP7添加mysqli扩展
    MySQL中的锁(表锁、行锁)
  • 原文地址:https://www.cnblogs.com/xcbb/p/14644160.html
Copyright © 2020-2023  润新知