python类私有属性及访问控制

不同于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,相当于扩张)的概念,只是通过这种方法变相地实现了属性访问控制的功能,
但是呢这个方法也很有用,尤其在多重继承,或者大项目的情况下,各个类及实例可能出现属性冲突的情况,就可以通过这个功能来实现.

猜你喜欢

转载自blog.csdn.net/renyiforever/article/details/79921854