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