不同于c++,java这些编译型语言Pyt,hon根本没有访问控制,只有变量名压缩…这么说的要么是大神,要么是像我这样钻牛角尖的…
首先看一段代码,我们想对象的一个属性只能被这个这个对象(即通过类里定义的方法来访问)所访问时,通常会这么写:
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
print(self.__age)
def __print(self):
print("hello,world")
a = Person("renyi", 25)
print(a.name)
print(a.__age)
输出可以看到:
25
renyi
Traceback (most recent call last):
File "E:/githubproject/Source-code/basis/class/class_home/class5.py", line 13, in <module>
print(a.__age)
AttributeError: 'Person' object has no attribute '__age'
在执行时,__age能通过内部方法来访问,外部执行时a.name能正常访问,但是__age属性却不能访问.这个就是我们初学的时候所听说的,python访问控制,也称__age是Person类的私有属性
但是呢这个是伪的私有属性print(a.dict)
print(a._Person__age)果:
renyi
{'name': 'renyi', '_Person__age': 25}
25
可以看到age属性还是能够强制访问的.(对于方法也一样能通过类名_方法名来访问)
通过查看官网文档
意思大概是说,python不支持私有属性,但当属性命名为时,会将属性改名为_类名属性名.
这个方法其实是变量名压缩(mangling,相当于扩张)的概念,只是通过这种方法变相地实现了属性访问控制的功能,
但是呢这个方法也很有用,尤其在多重继承,或者大项目的情况下,各个类及实例可能出现属性冲突的情况,就可以通过这个功能来实现.