Python 类的私有属性和 name mangling
Posted 等待未知
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 类的私有属性和 name mangling相关的知识,希望对你有一定的参考价值。
Pep-8 (https://www.python.org/dev/peps/pep-0008)中给出了 一些 python 程序中命名的规范,其中有一条是 name mangling.
在一个类中定义的属性(无论是类属性还是实例属性),如果是以 双下划线 (__) 开头,那么这个属性是对外 (包括其子类中) 不可见的,类似于 java 中的 private 属性。如何做到这一点呢, 毕竟 Python 并没有真正意义上的访问约束机制(比如 private, protected 修饰符)。Python 的做法是 name mangling, 姑且翻译成名称扭曲吧。具体做法是 如果你在某个类 clsA 中定义了一个属性,名称是 __a, 那么 python 会把这个属性更名成 _clsA__a, 但是更名后不影响你在内部使用,你在类的内部,还是可以使用 self.__a 来范围。如果你非要在外部访问 这个属性,就只能使用 inst._clsA__a 来访问。 (详细的解释可以参考 pep-8: https://www.python.org/dev/peps/pep-0008/#naming-conventions)
下面是示例:
>>> class A(): ... __clsattr = ‘classattr‘ ... def __init__(self): ... self.__instattr = 5 ... self.__instattr2_ = ‘ending underscore‘ ... ... def get_instattr(self): ... print(self.__instattr) ... ... @classmethod ... def get_clsattr(cls): ... print(cls.__clsattr) ... >>> A.get_clsattr() classattr >>> A.__clsattr Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: type object ‘A‘ has no attribute ‘__clsattr‘ >>> A._A__clsattr ‘classattr‘ >>> obj = A() >>> obj.get_instattr() 5 >>> obj.__instattr Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: ‘A‘ object has no attribute ‘__instattr‘ >>> obj._A__instattr 5 >>> obj._A__instattr2_ ‘ending underscore‘
以上是关于Python 类的私有属性和 name mangling的主要内容,如果未能解决你的问题,请参考以下文章