• 【Python】对_和__差别的理解


    在其他语言中,属性以_开头一般用于表示这个属性是私有属性,不能在外部访问。

    在python中是不存在私有属性这种说法的。以_开头的属性,只是表名是私有属性,和API的调用没有关系。但是也是可以调用的

    class A():
        def __init__(self):
            self._private = "am I private?"
    
    a = A()
    print(a._private)

    # 结果
    # ‘am I private?’

    以_ _开头的属性,可以实现私有的功能。但它真正的用途是防止子类重写该属性。

    class A():
        def __init__(self):
            self.__private = "am I private?"
    
    a = A()
    print(a.__private)
    
    # Traceback (most recent call last):
    #   File "E:/WWW/py3/test/config.py", line 7, in <module>
    #     print(a.__private)
    # AttributeError: 'A' object has no attribute '__private'

    _ _private属性依旧可以被访问。以上的调用报错的原因,是调用错了名字。

    _ _实现防止子类重写的原理,其实就是给属性改一个名字。

    我们用dir()函数可以看到

    class A():
        def __init__(self):
            self.__private = "am I private?"
    
    a = A()
    print(dir(a))
    
    #['_A__private', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__',
    '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

    这个'_A__private'其实就是__private。为了防止复写,给他改了个名字(总觉得这种处理方式有点萌哈哈哈哈)

    所以如果想调用,甚至修改,只需要调用  a._A__private

    但是别这么做啊!!!!

    class A():
        def __init__(self):
            self.__private = "am I private?"
    
        def func(self):
            print(self.__private)
    
    a = A()
    a.func()
    a._A__private = 'nonono'
    a.func()
    
    # am I private?
    # nonono

    参考:python _、__和__xx__的区别

  • 相关阅读:
    FZU Monthly-201906 tutorial
    FZU Monthly-201906 获奖名单
    FZU Monthly-201905 tutorial
    BZOJ1009 GT考试
    BZOJ2428 均分数据
    模拟退火
    BZOJ3680 吊打XXX
    BZOJ4818 序列计数
    BZOJ4103 异或运算
    BZOJ3512 DZY Loves Math IV
  • 原文地址:https://www.cnblogs.com/Hed-geh0g/p/8525461.html
Copyright © 2020-2023  润新知