python __XX__ 一篮子 反射 魔法方法

映射(对象的内置方法):反射指的是通过 “字符串” 对 对象的属性进行操作。   

注意 :这里是通过‘字符串’的方式去找对象的属性方法,通过对象.属性  也可以 获取属性或方法,

            但是为了方便  我们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值” 设置属性时触发。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2020-01-07 19:13  躺云飘  阅读(206)  评论(0编辑  收藏  举报