一、隐藏属性
1、为什么要隐藏属性
定义属性就是为了使用,所以隐藏并不是目的,隐藏属性的目的在于限制类外部对数据的直接操作
然后类内应该提供相应的接口来允许类外部间接地操作数据
接口之上可以附加额外的逻辑来对数据的操作进行严格地控制
这就是隐藏属性和开放接口的意义
2、如何隐藏属性
Python的Class机制采用双下划线开头的方式将属性隐藏起来,
类属性、对象属性、方法属性都可以隐藏
类中所有双下滑线开头的属性都会在类定义阶段、检测语法时自动变成“_类名__属性名”的形式
隐藏属性对外不对内(对外隐藏,对内不隐藏)
可以通过类属性查看: 类名.__dict__
# 隐藏属性 class Student(): # 隐藏类属性 __country = 'CHINA' # _Student__country def __init__(self, name, age): # 隐藏对象属性 self.__name = name # _Student__name self.age = age # 隐藏方法属性 def __func(self): # _Student__func print('from func')
print(Student.__dict__)
二、开放接口
# 开放接口,返回类内部的隐藏属性值,并且可以增加限制 class Student(): # 学生类 __country = 'CHINA' # 类属性 # 初始化方法,自定义对象属性 def __init__(self, name, age): # 隐藏对象属性 self.__name = name # _Student__name self.age = age # 隐藏方法属性 def __func(self): # _Student__func print('from func') # 开放接口,返回隐藏的类的属性值 def get_country(self): return self.__country # self._Student__country # 增设限制 def set_country(self, v): if not type(v) is str: print('不是str') return self.__country = v print(Student.__dict__)
三、property装饰器
Python专门提供的一个装饰器property,可以将类中的函数“伪装成”对象的数据属性
对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次访问的结果
使用property有效地保证了属性 访问 的一致性,另外property还提供 设置 和 删除 属性的功能
# property 装饰器 class Student(): # 隐藏类属性 __country = 'CHINA' # 自定义对象属性 def __init__(self, name, age): # 隐藏对象属性 self.__name = name # _Student__name self.age = age # 隐藏方法属性 def __func(self): # 可以通过_Student__func调用 print('from func') # 通过@property把函数伪装成属性 # 该特殊属性作为接口,返回了原来的隐藏属性的值 @property def country(self): return self.__country # 可以通过self._Student__country查看 # property提供的设置功能(改的操作) @country.setter def country(self, v): if not type(v) is str: return self.__country = v # property提供的删除属性 @country.deleter def country(self): del self.__country stu = Student('tom', 18) # 实例化,产生stu对象 print(stu.country) # 通过 对象名.特殊属性名 调用 stu.country = 'xxx' # 修改属性值 # print(stu.country) del stu.country # 删除属性值
补充:property的第二种使用方法
class Student(): __country = 'CHINA' def __init__(self, name, age): self.__name = name # _Student__name self.age = age def __func(self): # _Student__func print('from func') def get_country(self): return self.__country # self._Student__country def set_country(self, v): if not type(v) is str: return self.__country = v def del_country(self): del self.__country country = property(get_country, set_country, del_country) stu = Student('tom', 18) # 查 stu.country = 'American' # 改 del stu.del_country # 删