@property
类的静态属性,封装内部具体实现细节,调用的时候类似调用数据属性。既可以访问类属性,也可以访问实例属性
成都创新互联公司是一家专注于网站设计制作、做网站与策划设计,菏泽网站建设哪家好?成都创新互联公司做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:菏泽等地区。菏泽做网站价格咨询:18982081108
![](/upload/otherpic66/6de11e5b657bbb1c6e02f4ed64821fa7.png)
@classmethod
类方法
![](/upload/otherpic66/d36f46a721750e99047808d30276f111.png)
@staticmethod
类的工具包,不能使用类变量和实例变量
第二种
继承、多态、封装
多态:在不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同
封装:
封装数据:将数据隐藏起来这不是目的。隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制。
封装方法:目的是隔离复杂度
封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。
反射 主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
`getattr(object, name, default=None)```:判断object中有没有一个name字符串对应的方法或属性
hasattr(object,'name') - 检测是否含有某属性
setattr(object,name,True) - 设置属性\
delattr(object,'name') - 删除属性
基于反射- 动态导入模块
getattr, delattr, setattr
getattr:一个对象在调不存在的属性时候,就会自动触发。
delattr: 一个对象删除类属性或对象属性时候,会触发
setattr: 在设置属性或新增属性时候,默认就会触发 setattr,如果在创建类的时候重新定义了setattr方法,要写上操作属性字典代码,不写就增加属性不成功
利用上述几个内置方法,可以二次加工标准类型。比如重新定义setattr,在新增属性之前加点自定义参数
包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。
实现授权的关键点就是覆盖getattr方法
setitem,getitem,delitem用字典方式调用属性的时候就会触发。如:kk['name']
用点(.)方式调用属性会触发 getattr等方法。如:kk.name
str,repr,:改变对象的字符串显示str,repr
自定制格式化字符串format
str函数或者print函数--->obj.str()
repr或者交互式解释器--->obj.repr()
如果str没有被定义,那么就会使用repr来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
slots是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)
使用点来访问属性本质就是在访问类或者对象的dict属性字典(类的字典是共享的,而每个实例的是独立的),字典会占用大量内存,如果有一个类,属性很少,但是实例很多,为了节省内存可以使用slots取代实例的dict。(可以说是用来作为一个内存优化工具)
定义了slots后的类不再 支持一些普通类特性了,比如多继承
析构方法,当对象在内存中被释放时,自动触发执行。
注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义del,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了del