在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()
子类实例属性: 子类的受保护实例变量 子类类属性: 受保护变量 实例属性: 子类的受保护实例变量 类属性: 受保护变量 子类实例对象调用类属性 子类的受保护实例变量 类方法中类属性: 受保护变量 类对象调用类属性 受保护变量 受保护的方法
总的来说,和公共变量没有什么特别大的区别
#!/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()
实例对象 - 类内部调用私有变量: 私有变量 类对象 - 类内部调用私有变量: 私有变量 实例对象 - 外部调用私有变量 私有变量 类方法 - 类对象 - 类内部调用私有变量: 私有变量 类对象 - 外部调用私有变量 私有变量 私有方法
无论是受保护型变量还是私有变量,其实在外部还是能访问的,所以并不能真正控制属性的访问权限;
那我们如何才能控制属性的访问权限呢?Python给出的答案是装饰器 @property,这将在后面的篇幅中介绍