码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-03-07 23:59:16      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:就是   blank   class   for   存在   traceback   ace   api   语言   

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

在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】对_和__差别的理解

标签:就是   blank   class   for   存在   traceback   ace   api   语言   

原文地址:https://www.cnblogs.com/Hed-geh0g/p/8525461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!