一. 反射
1.什么是反射?
指的是在程序运行过程中可以动态获取对象的信息
2.为何用反射?
在调用某个参数时,需要知道这个参数是否有相关的属性或功能
3. 如何实现反射?
> 先通过dir: 查看出某一个对象下可以 . 出哪些属性来
>可以通过字符串反射到真正的属性上,得到属性值
四个内置函数: 通过字符串来操作属性值
1、hasatter() 查看是否存在该属性
2、getatter() 获取该属性的内容
getatter(10, 'x',None) 给一个默认值,使其没有属性时不报错
3、setter() 修改该属性的内容
4、delatter() 删除该属性
二. 内置方法
1、什么是内置方法?
定义在类内部,以__开头并以__结尾的方法
特点:会在某种情况下自动触发执行
2、为什么要用内置方法
为了定制化我们的类或对象
3、如何使用内置方法
__str__: 在打印对象时会自动触发,然后将返回值(必须是字符串 类型)当做本次打印的结果输出
__del__: 在清理对象时触发,会先执行该方法(在程序执行结束后清理空间时也会触发)
class People:
def __init__(self, name, age):
self.name = name
self.age = age
self.x = open('a.txt',mode='w')
# self.x = 占据的是操作系统资源
def __del__(self):
# print('run...')
# 发起系统调用,告诉操作系统回收相关的系统资源
self.x.close()
obj = People('辣白菜同学', 18)
# del obj # obj.__del__()
print('============>')
三. 元类
1、什么是元类
元类就是用来实例化产生的类
元类-->实例化-->类-->实例化-->对象
查看内置的元类: print(type(类))
我们用class关键字定义的所有的类都是由元类type实例化得到的
2、class关键字创造类的步骤
类的特征: 类名, 类的基类(父类),执行类体代码拿到类的名称空间
class_dic={}
exec (类体代码,{},class_dic)
然后调用元类
3、如何自定义元类来控制类的产生
class Mymeta(type) #只有继承了type类的类才是元类
class People(mataclass = Mymeta)
People = Mymeta(class_name,class_bases,class_dic)
调用Mymeta发生三件事
- 先造一个空对象=>People,调用类内的__new__方法
- 调用Mymeta这个类内的__init__方法,完成初始化对象的操作
- 返回初始化好的对象
4、__call__方法
如果想让一个对象可以加括号调用,需要在该对象的类中添加一个方法__call__
__call__里的代码干了三件事
- 先造一个空对象,调用类内的__new__方法
- 调用type这个类内的__init__方法,完成初始化对象的操作
- 返回初始化好的对象
5、自定义元类控制类的调用==>类的对象的产生
四. 属性查找
对象的属性查找:
父类不等于元类
对象-->类-->父类
永远不会找到元类去
类的属性查找:
找完父类,去元类里找