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

Python面向对象中的“私有化”

时间:2018-05-12 20:35:29      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:允许   mat   sel   时机   block   get   setattr   自己   python面向对   

Python面向对象中的“私有化”

Python并不直接支持私有方式,而要靠程序员自己把握在外部进行特性修改的时机。

为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可。

由双下划线 __ 开始的属性在运行时被“混淆”,所以直接访问是不允许的。

实际上,在 Python 带有双下划线的属性或方法并非正真意义上的私有,它们仍然可以被访问。

在类的内部定义中,所有以双下划线开始的名字都被“翻译”成前面加上单下划线和类名的形式。

示例:

>>> class TestObj(object):
...     __war = "world"
...     
...     def __init__(self):
...         self.__har = "hello"
...         
...     def __foo(self):
...         print(self.__har + self.__war)
...         
...     
...
>>> t = TestObj()

>>> dir(t) # 拿到t里面的所有方法
[_TestObj__foo, _TestObj__har, _TestObj__war, __class__, __delattr__, __dict__, __dir__, __doc__, __eq__, __format__, __ge__, __getat
tribute__, __gt__, __hash__, __init__, __le__, __lt__, __module__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__
, __sizeof__, __str__, __subclasshook__, __weakref__]

>>> t.__war
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    t.__war
AttributeError: TestObj object has no attribute __war

>>> t.__har
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    t.__har
AttributeError: TestObj object has no attribute __har

>>> t.foo()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    t.foo()
AttributeError: TestObj object has no attribute foo

>>> t._TestObj__war
world

>>> t._TestObj__har
hello

>>> t._TestObj__foo()
helloworld

 

Python面向对象中的“私有化”

标签:允许   mat   sel   时机   block   get   setattr   自己   python面向对   

原文地址:https://www.cnblogs.com/bigtreei/p/9029528.html

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