一 反射
1.面向对象中的反射:通过字符串的形式操作对象的相关属性,python中一切事物都是属性(都可以使用反射)
四个可以实现自省<反射>的函数:hasattr / getattr / setattr /delattr.
class Teacher: school='oldboy' def __init__(self,name,age): self.name=name self.age=age def teach(self): print('%s teach'%self.name) print(Teacher.school) ##查看类的数据属性 print(Teacher.__dict__) ##查看类的名称空间 print(Teacher.__dict__['school']) #根据名称空间的KEY找到对应的值 print(hasattr(Teacher,'school')) #判断是是否有school属性 print(getattr(Teacher,'school')) #获取类的属性值 print(getattr(Teacher,'schoolle',None)) #获取school的返回值,如果没有可设置返回值 Teacher.x=123456 setattr(Teacher,'x',123) #修改属性 print(Teacher.x) delattr(Teacher,'school') #删除属性 print(Teacher.school) setattr(Teacher,'school','偶的博爱') print(Teacher.school) ##对象同样可以利用反射,通过字符串的形式操作相关属性 t=Teacher('egon',18) print(hasattr(t,'name')) print(getattr(t,'name')) print(setattr(t,'sex','male')) print(getattr(t,'sex'))
在创建类的时候,会产生名称空间,存放着各个属性的名称与值得绑定关系,而且以字典的形式进行存放,所以语法上用比较贴切的__dict__便可查看.如果我们想取值的话,可以用Teacher.school来获得属性,但同时我们可以利用__dict__中的key来取值,即Teacher.__dict__['school'].注意里面是字符串的形式.而由于我们用户input输入的时候是字符串形式,为了便于获取相关属性就产生了反射的概念,具体请研究上面的代码栏。
二 __str__的用法
改变对象的字符串显示
class Teacher: def __init__(self,name,age): self.name=name self.age=age self.courses=[] def teach(self): print('%s teach'%self.name) def __str__(self): ##改变对象的字符串形式 return '<name: %s age:%s>'%(self.name,self.age) ##返回值必须是字符串,否则会抛出异常 egon=Teacher('egon',18) print(egon) #print(egon.__str__())
三 __del__的用法
当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
import time class Foo: def __init__(self,x): self.x=x print('connect mysql') def __del__(self): '''做一些与这个对象有关的清理操作''' print('good') f=Foo(10) print(f.x) =========结果====== connect mysql 10 good ----->由此可以当对象在内存中被释放时,自动触发执行