06_02、面向对象的特征一:封装
封装:
- 将属性和方法封装到一个抽象的类中;外界使用类创建对象,对象调用方法;对象方法的细节都被封装再类的内部
- 封装就是把同一类型的东西放在一起,通过self.xxx去调用。
一、隐藏属性
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 # 删
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通