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

    希望能帮助到各位!

  • 相关阅读:
    python入门19 异常及异常处理 异常捕获
    python入门18 继承和多态
    python入门17 类和对象
    python入门16 递归函数 高阶函数
    接口测试get请求url拼接函数(python)
    python入门15 函数
    ssh tunnel 三种模式
    k8s 容器的生命周期钩子
    对k8s service的一些理解
    windows下使用pyinstaller把python文件打包成exe可执行文件
  • 原文地址:https://www.cnblogs.com/xcbb/p/14644160.html
Copyright © 2020-2023  润新知