我是靠谱客的博主 满意八宝粥,最近开发中收集的这篇文章主要介绍Python中没有完全的私有属性吗?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

一个很有意思的问题,关于Python内有没有真正的私有属性。我觉得可以说有,也可以说没有,具体看对比的语言。

有时候,python看似可以设置私有属性,用代码表示

class BB():

    def __init__(self, name):

        self.__name = name


    def get_name(self):

        return self.__name



b = BB('bb')

d = BB('dd')

b.__name = 'cc'



print(b.__name)  # cc

print(b.get_name())  # bb

print(d.get_name())  # dd

print(d.__name)  # raise an exception

 

观察打印结果,b.__name = ‘cc’ ,b.get_name() = ‘bb'

我们可知,b.__name = ‘cc’ 其实并不是修改了私有属性,只是定义了实例对象b的一个新的变量名,变量名以下划线(dunder)开头。私有属性并不会被修改。

而d.get_name() = ‘dd' ,d.__name调用会抛出异常。我们可以很明显看出,变量只是实例对象b的属性。并没有加载进入类中,在另一个实例对象d中也不可调用。

 

那么为什么又说python没有真正的私有属性呢?

因为python中,通过【实例对象._类对象__私有属性】,比如b._BB__name是可以直接访问私有属性的。

因此,私有属性只是看似不能获取,如果你真的想要拿,也是可以拿到的。

 

 

20190212,在github看到类似本问题的回答,记录一下

Python中单下划线和双下划线

>>> class MyClass():
...     def __init__(self):
...             self.__superprivate = "Hello"
...             self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}

__foo__:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,就是例如__init__(),__del__(),__call__()这些特殊方法

_foo:一种约定,用来指定变量私有.程序员用来指定私有变量的一种方式.不能用from module import * 导入,其他方面和公有一样访问;

__foo:这个有真正的意义:解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._类名__xxx这样的方式可以访问.

详情见:http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python

或者: http://www.zhihu.com/question/19754941

最后

以上就是满意八宝粥为你收集整理的Python中没有完全的私有属性吗?的全部内容,希望文章能够帮你解决Python中没有完全的私有属性吗?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部