@property
类的静态属性,封装内部具体实现细节,调用的时候类似调用数据属性。既可以访问类属性,也可以访问实例属性

  ![](https://s1.51cto.com/images/blog/201906/08/6de11e5b657bbb1c6e02f4ed64821fa7.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

@classmethod
类方法

  ![](https://s1.51cto.com/images/blog/201906/08/d36f46a721750e99047808d30276f111.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

@staticmethod
类的工具包,不能使用类变量和实例变量

Python- 反射 及部份内置属性方法

继承顺序

Python- 反射 及部份内置属性方法

第二种

Python- 反射 及部份内置属性方法

继承、多态、封装

多态:在不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同

封装
封装数据:将数据隐藏起来这不是目的。隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制。
封装方法:目的是隔离复杂度

封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。

反射

反射 主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。

`getattr(object, name, default=None)```:判断object中有没有一个name字符串对应的方法或属性

Python- 反射 及部份内置属性方法

hasattr(object,'name') - 检测是否含有某属性 

Python- 反射 及部份内置属性方法

setattr(object,name,True)  - 设置属性\

Python- 反射 及部份内置属性方法

delattr(object,'name') - 删除属性

Python- 反射 及部份内置属性方法

基于反射- 动态导入模块

Python- 反射 及部份内置属性方法

内置属性方法

getattrdelattr , setattr

getattr :一个对象在调不存在的属性时候,就会自动触发。
Python- 反射 及部份内置属性方法

delattr : 一个对象删除类属性或对象属性时候,会触发

setattr : 在设置属性或新增属性时候,默认就会触发 setattr ,如果在创建类的时候重新定义了setattr方法,要写上操作属性字典代码,不写就增加属性不成功
Python- 反射 及部份内置属性方法

利用上述几个内置方法,可以二次加工标准类型。比如重新定义setattr,在新增属性之前加点自定义参数

包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

实现授权的关键点就是覆盖getattr方法

Python- 反射 及部份内置属性方法

setitem,getitem,delitem 用字典方式调用属性的时候就会触发。如:kk['name']

用点(.)方式调用属性会触发 getattr等方法。如:kk.name
Python- 反射 及部份内置属性方法

str,repr,:改变对象的字符串显示str,repr
自定制格式化字符串format

str函数或者print函数--->obj.str()
repr或者交互式解释器--->obj.repr()
如果str没有被定义,那么就会使用repr来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常

slots

slots是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)

使用点来访问属性本质就是在访问类或者对象的dict属性字典(类的字典是共享的,而每个实例的是独立的),字典会占用大量内存,如果有一个类,属性很少,但是实例很多,为了节省内存可以使用slots取代实例的dict。(可以说是用来作为一个内存优化工具)

定义了slots后的类不再 支持一些普通类特性了,比如多继承

Python- 反射 及部份内置属性方法

del

析构方法,当对象在内存中被释放时,自动触发执行。

注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义del,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了del

nextiter实现迭代器协议

Python- 反射 及部份内置属性方法