映射(对象的内置方法):反射指的是通过 “字符串” 对 对象的属性进行操作。
注意 :这里是通过‘字符串’的方式去找对象的属性方法,通过对象.属性 也可以 获取属性或方法,
但是为了方便 我们python提供了通过字符串的方式去操作
- hasattr: 通过 “字符串” 判断对象的属性或方法是否存在。 - getattr: 通过 “字符串” 获取对象的属性或方法。 - setattr: 通过 “字符串” 设置对象的属性或方法。 - delattr: 通过 “字符串” 删除对象的属性或方法。
先创建一个对象
有: hasattr(obj,"字符串")
获取:getattr(obj,"字符串") 获取对象的属性值 或者 方法名(获取方法返回值是方法名)若要执行就要加()
设置:setattr(obj,"字符串",value) 给属性设置一个值,有则覆盖,无则新增
删除:deladdr(obj,"字符串") 删除方法名会报错 只有getattr 可以获取函数名
魔法方法(类的内置方法): 注意是在类内部定义 旨在控制过程(拦截方法)
定义:凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法
__init__: 在调用类通过 类() 产生对象时触发
扩展:函数的名称空间在调用时产生,类的名称空间在定义时产生(联想到元类 和 object类)
__new__ : 在__new__之前自动触发,__new__ 方法直接调用 返回object.__new__ 产生一个对象(看源码)
为什么类中可以不定义__init__方法 就可以产生对象 元类 type call new orm复习 截图
__init__ 在对象需要传参时使用,没有参数时,可以不用,
即在类加() 括号时,触发type元类的__call__ 方法 ==> __new__方法 产生对象
'''
创建类实例过程:
1、先通过类的原类的__new__方法来创建类对象
2、在通过类的原类的__init__方法来实现对类对象的属性以及方法的赋值
3、通过调用类的原类的__call__方法来实现对类对象的__new__方法以及__init__方法的调度
4、调用类对象的__new__方法实现类的实例
5、调用类对象的__init__方法实现类实例的属性以及方法的赋值
'''
注意: __get....__方法 自带参数(self,item)对象.item会自动把参数传给 get方法
__set..__方法自带参数(self,key,value) 对象.key = value 会自动把参数传给set 方法
__getattr__: 在通过 “对象.属性” 属性没有时触发
语法: def __setaddr__(self):
__getattribute__: 在 “对象.属性” 获取属性时,无论 "属性有没有" 都会触发。
__setattr__: 当 “对象.属性 = 属性值” , 添加或修改属性时触发
__call__: 对象+() 时,触发 类+()发生了什么事: type类 的__call__==>__new__
__str__: 在打印对象时触发 必须要一个字符串的返回值
__getitem__ : 在对象通过 “对象[key]” 获取属性时触发。
__setitem__: 在对象通过 “对象[key]=value值” 设置属性时触发。