当前位置: 首页 > 后端技术 > Python

Python-Object-Oriented-Advanced

时间:2023-03-26 14:03:54 Python

Object-OrientedAdvanced一、反射与自省反射是指通过字符串操作对象的属性,这涉及到四个内置函数的使用,getattr,hasattr,setattr,delattr,自省是的可以在运行时获取对象的type、type、isinstance、dir等classFoo:def__init__(self,name):self.name=namedeff1(self):print('fromFoo.f1')obj=Foo('action')print(obj.__dict__)#Result:{'name':'action'}print(obj.name)#Result:action"""hasattr(obj,name_str):判断objec是否有name_strmethodorattributehasattr判断obj是否有namemethod或attribute"""print(hasattr(obj,'name'))#Result:trueifhasattr(obj,'f1'):"""getattr(obj,name_str):getThemethodorfunctiongetattrintheobjectobject获取object对象中与f1同名的方法或函数"""f1=getattr(obj,'f1')f1()res=getattr(obj,'xxx',无)打印(res)#Result:None"""setattr(obj,name_str,value):setavaluemethodorattributenamedname_strfortheobjectsetattrseta18methodorattributenamedagefortheobjectobject"""setattr(obj,'age',18)print(obj.__dict__)"""delattr(obj,name_str):删除object对象中的name_str方法或属性"""delattr(obj,'age')print(obj.__dict__)#type判断对象类型a=123print(type(a))#result:#dir获取带参数对象的所有属性和方法;不带参数,返回当前范围内变量、方法和定义类型的列表','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','f1']#isinstance判断对象是否为已知类型res=isinstance(a,int)print(res)#结果:True2。内置方法在python中,类机制内置了很多特殊的方法来帮助用户高度定制自己的类,这些内置方法以双下划线开头和结尾,当满足一定条件时会自动触发。常用的有__str__和__del__等__str__()或__repr__()当使用print输出对象时,默认打印对象的内存地址如果该类定义了__str__方法,那么将打印从该方法返回的数据。__str__方法实际上调用了__repr__方法classPeople:def__init__(self,name,age):self.name=nameself.age=agedef__str__(self):returnf'name:{self.name},age:{self.age}'def__repr__(self):returnf'name:{self.name},age:{self.age}'people=People('cross',20)print(people)#结果:name:cross,age:20__del__()删除对象时,python解释器默认会调用__del__()方法__del__(self):print(f'{self}objecthasbeendeleted')haier1=Washer(10,20)#<__main__.Washerobjectat0x0000026118223278>theobjecthasbeendeleteddelhaier1__new__()__new__是构造方法中的python类,它在__init__方法之前执行,可以在python中用来实现单例模式。只有一个类InstanceclassPeople:def__new__(cls,*args,**kwargs):print("__new__",cls)instance=object.__new__(cls)returninstancedef__init__(self,name,age):打印(“__init__”,自我)self._name=nameself._age=agep=People("action",25)"""__new____init__<__main__.Peopleobjectat0x102c9ca20>"""__new__和__init__都被调用了__new__方法用于创建一个对象并返回该对象。当返回对象时,会自动调用__init__方法进行初始化。__new__方法是静态方法,__init__是实例方法单例模式classPerson:_instance=Nonedef__new__(cls,*args,**kwargs):ifcls._instanceisNone:cls._instance=object.__new__(cls)returncls._instancep=Person()p1=Person()print(id(p),id(p1))#结果:43645694564364569456print(pisp1)#结果:True