Python反射和内置方法重写操作详解
本文实例讲述了Python反射和内置方法重写操作。分享给大家供大家参考,具体如下:
isinstance和issubclass
isinstance(obj,cls)检查是否obj是否是类cls的对象,类似type()
classFoo(object): pass obj=Foo() isinstance(obj,Foo)
issubclass(sub,super)检查sub类是否是super类的派生类
classFoo(object): pass classBar(Foo): pass issubclass(Bar,Foo)
反射
1什么是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
四个反射函数
hasattr(obj,str)
检测是否含有某属性
getattr(obj,str)
获取属性,不存在报错
setattr(obj,str,value)
设置属性
delattr(obj,str)
删除属性,不存在报错
导入其他模块,利用反射查找该模块是否存在某个方法
deftest(): print('fromthetest')
item系列
__getitem__\__setitem__\__delitem__
classFoo: def__init__(self,name): self.name=name def__getitem__(self,item): print(self.__dict__[item]) def__setitem__(self,key,value): self.__dict__[key]=value def__delitem__(self,key): print('delobj[key]时,我执行') self.__dict__.pop(key) def__delattr__(self,item): print('delobj.key时,我执行') self.__dict__.pop(item) f1=Foo('sb') f1['age']=18 f1['age1']=19 delf1.age1 delf1['age'] f1['name']='alex' print(f1.__dict__)
运行结果:
delobj.key时,我执行
delobj[key]时,我执行
{'name':'alex'}
__new__
classA: def__init__(self): self.x=1 print('ininitfunction') def__new__(cls,*args,**kwargs): print('innewfunction') returnobject.__new__(A,*args,**kwargs) a=A() print(a.x)
运行结果:
innewfunction
ininitfunction
1
单例模式:
classA: def__new__(cls): ifnothasattr(cls,'obj'): cls.obj=object.__new__(cls) returncls.obj a=A() b=A() print(aisb)
运行结果:
True
__call__
对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行是由对象后加括号触发的,即:对象()或者类()()
classFoo: def__init__(self): pass def__call__(self,*args,**kwargs): print('__call__') obj=Foo()#执行__init__ obj()#执行__call__
运行输出:
__call__
__len__
classA: def__init__(self): self.a=1 self.b=2 def__len__(self): returnlen(self.__dict__) a=A() print(len(a))
运行结果:
2
__hash__
classA: def__init__(self): self.a=1 self.b=2 def__hash__(self): returnhash(str(self.a)+str(self.b)) a=A() print(hash(a))
运行结果:
-1777982230
__eq__
classA: def__init__(self): self.a=1 self.b=2 def__eq__(self,obj): ifself.a==obj.aandself.b==obj.b: returnTrue a=A() b=A() print(a==b)
运行结果:
True
合并名字性别一样的人:
classPerson: def__init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def__hash__(self): returnhash(self.name+self.sex) def__eq__(self,other): ifself.name==other.nameandself.sex==other.sex:returnTrue p_lst=[] foriinrange(84): p_lst.append(Person('egon',i,'male')) print(p_lst) print(set(p_lst))
运行结果:
[<__main__.Personobjectat0x01425AB0>,<__main__.Personobjectat0x01425AD0>,<__main__.Personobjectat0x01425AF0>,<__main__.Personobjectat0x01425910>,<__main__.Personobjectat0x014258D0>,<__main__.Personobjectat0x01425950>,<__main__.Personobjectat0x01425970>,<__main__.Personobjectat0x014259D0>,<__main__.Personobjectat0x01425C70>,<__main__.Personobjectat0x01425890>,<__main__.Personobjectat0x01425B30>,<__main__.Personobjectat0x01425BB0>,<__main__.Personobjectat0x01425C30>,<__main__.Personobjectat0x01429710>,<__main__.Personobjectat0x01429730>,<__main__.Personobjectat0x014298F0>,<__main__.Personobjectat0x01429910>,<__main__.Personobjectat0x01429930>,<__main__.Personobjectat0x01429950>,<__main__.Personobjectat0x01429970>,<__main__.Personobjectat0x01429990>,<__main__.Personobjectat0x014299B0>,<__main__.Personobjectat0x014299D0>,<__main__.Personobjectat0x014299F0>,<__main__.Personobjectat0x01429A10>,<__main__.Personobjectat0x01429A30>,<__main__.Personobjectat0x01429A50>,<__main__.Personobjectat0x01429A70>,<__main__.Personobjectat0x01429A90>,<__main__.Personobjectat0x01429AB0>,<__main__.Personobjectat0x01429AD0>,<__main__.Personobjectat0x01429AF0>,<__main__.Personobjectat0x01429B10>,<__main__.Personobjectat0x01429B30>,<__main__.Personobjectat0x01429B50>,<__main__.Personobjectat0x01429B70>,<__main__.Personobjectat0x01429B90>,<__main__.Personobjectat0x01429BB0>,<__main__.Personobjectat0x01429BD0>,<__main__.Personobjectat0x01429BF0>,<__main__.Personobjectat0x01429C10>,<__main__.Personobjectat0x01429C30>,<__main__.Personobjectat0x01429C50>,<__main__.Personobjectat0x01429C70>,<__main__.Personobjectat0x01429C90>,<__main__.Personobjectat0x01429CB0>,<__main__.Personobjectat0x01429CD0>,<__main__.Personobjectat0x01429CF0>,<__main__.Personobjectat0x01429D10>,<__main__.Personobjectat0x01429D30>,<__main__.Personobjectat0x01429D50>,<__main__.Personobjectat0x01429D70>,<__main__.Personobjectat0x01429D90>,<__main__.Personobjectat0x01429DB0>,<__main__.Personobjectat0x01429DD0>,<__main__.Personobjectat0x01429DF0>,<__main__.Personobjectat0x01429E10>,<__main__.Personobjectat0x01429E30>,<__main__.Personobjectat0x01429E50>,<__main__.Personobjectat0x01429E70>,<__main__.Personobjectat0x01429E90>,<__main__.Personobjectat0x01429EB0>,<__main__.Personobjectat0x01429ED0>,<__main__.Personobjectat0x01429EF0>,<__main__.Personobjectat0x01429F10>,<__main__.Personobjectat0x01429F30>,<__main__.Personobjectat0x01429F50>,<__main__.Personobjectat0x01429F70>,<__main__.Personobjectat0x01429F90>,<__main__.Personobjectat0x01429FB0>,<__main__.Personobjectat0x01429FD0>,<__main__.Personobjectat0x01429FF0>,<__main__.Personobjectat0x01751030>,<__main__.Personobjectat0x01751050>,<__main__.Personobjectat0x01751070>,<__main__.Personobjectat0x01751090>,<__main__.Personobjectat0x017510B0>,<__main__.Personobjectat0x017510D0>,<__main__.Personobjectat0x017510F0>,<__main__.Personobjectat0x01751110>,<__main__.Personobjectat0x01751130>,<__main__.Personobjectat0x01751150>,<__main__.Personobjectat0x01751170>,<__main__.Personobjectat0x01751190>]
{<__main__.Personobjectat0x01425AB0>}
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。