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

Posted TreeSir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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面向对象中的“私有化”的主要内容,如果未能解决你的问题,请参考以下文章

python面向对象中容易忘记的——私有化的属性和方法

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

python面向对象中容易忘记的——私有化的属性和方法

面向对象基础——构造方法私有化对象数组内部类

Python面向对象:一篇文章掌握面向对象的基础