前言
在Python的类里面,所有属性和方法默认都是公共的;但Python也可以设置受保护、私有类型的变量or方法
受保护类型的变量、方法
一般称为:protected变量
#!/usr/bin/env python # -*- coding: utf-8 -*- class protected: _protected = "受保护变量" name = "test" def test(self): print("实例属性:", self._protected) print("类属性:", protected._protected) @classmethod def class_m(cls): print("类方法中类属性:", cls._protected) def _test(self): print("受保护的方法") class protectedson(protected): def __init__(self): self._protected = "子类的受保护实例变量" print("子类实例属性:", self._protected) print("子类类属性:", protectedson._protected) if __name__ == "__main__": p1 = protectedson() p1.test() print("子类实例对象调用类属性", p1._protected) protectedson.class_m() print("类对象调用类属性", protectedson._protected) p1._test()
执行结果
子类实例属性: 子类的受保护实例变量 子类类属性: 受保护变量 实例属性: 子类的受保护实例变量 类属性: 受保护变量 子类实例对象调用类属性 子类的受保护实例变量 类方法中类属性: 受保护变量 类对象调用类属性 受保护变量 受保护的方法
知识点
- 在变量和方法前加一个下划线 _ 即可变成protected类型的变量or方法
- 父类的protected变量,子类能继承
- 实例对象能直接调用protected变量( 实例对象._protect ),类对象也能直接调用protected变量( 类对象._protect )
总的来说,和公共变量没有什么特别大的区别
私有类型的变量、方法
#!/usr/bin/env python # -*- coding: utf-8 -*- class privates: __private = "私有变量" def test(self): print("实例对象 - 类内部调用私有变量:", self.__private) print("类对象 - 类内部调用私有变量:", privates.__private) @classmethod def class_m(cls): print("类方法 - 类对象 - 类内部调用私有变量:", cls.__private) def __test(self): print("私有方法") if __name__ == "__main__": p1 = privates() p1.test() print("实例对象 - 外部调用私有变量", p1._privates__private) privates.class_m() print("类对象 - 外部调用私有变量", privates._privates__private) p1._privates__test()
执行方法
实例对象 - 类内部调用私有变量: 私有变量 类对象 - 类内部调用私有变量: 私有变量 实例对象 - 外部调用私有变量 私有变量 类方法 - 类对象 - 类内部调用私有变量: 私有变量 类对象 - 外部调用私有变量 私有变量 私有方法
知识点
- 在变量和方法前加两个下划线 __ 即可变成private类型的变量or方法
- 子类无法访问父类的私有变量、方法
- 私有变量只有本类的内部能直接调用
- But!外部真的不能访问吗?其实是可以访问的,python解释器对外会把 __私有变量 变成 _类名__私有变量 ,无论是实例对象还是类对象,都能通过 ._类名__私有变量 来调用私有变量,算是一种间接调用
总结
无论是受保护型变量还是私有变量,其实在外部还是能访问的,所以并不能真正控制属性的访问权限;
带着疑问
那我们如何才能控制属性的访问权限呢?Python给出的答案是装饰器 @property,这将在后面的篇幅中介绍