Python对_和__差别的理解

Posted hed-geh0g

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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__的区别





以上是关于Python对_和__差别的理解的主要内容,如果未能解决你的问题,请参考以下文章

对Python中“if `__name__`==`__main__`:”的理解

python多重继承的属性和方法调用顺序问题和对迭代器的初步理解

Python中 if __name__ == "__main__" 的理解

Python元类__prepare__方法深入理解

python之路之前没搞明白4面向对象(封装)

python _____xx__之间的差别