1.Introspection内省,即当解释型语言加载到内存并运行时,可以知道对象的类型以及对象下有哪些方法。1.1具有自省能力的方法type()获取对象的类型。该函数可以判断对象是否为字符串、整数、列表、字典等>>>type(1)>>>type("hello,world")>>>type([])>>>type({})>>>classA():...通过。..>>>a=A()>>>type(a)dir()这个函数可以返回一个对象拥有的所有属性名和方法名#returnlistinstance的所有方法名>>>dir([])['__add__','__class__','__contains__','__delattr__','__delitem__','__delslice__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__getslice__','__gt__','__hash__','__iadd__','__imul__','__init__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__rmul__','__setattr__','__setitem__','__setslice__','__sizeof__','__str__','__subclasshook__','append','count','extend','index','insert','pop','remove','reverse','sort']getattr()获取对象的属性hasattr()判断对象是否具有某个属性isinstance()判断对象是特定类型的实例还是自定义类>>>isinstance("python",str)#判断是否为字符串True>>>isinstance(10,int)#判断是否为int类型True>>>isinstance(False,bool)#判断是否为aboolvalueTrueid()函数返回对象的唯一标识符,标识符是一个整数CPython中的id()函数用于获取对象的内存地址。>>>a="python">>>id(a)140225451635560callable()使用callable判断一个对象是否可调用,比如函数和类,这些对象都是可调用对象>>>callable("hello")False>>>>>>callable(str)True>>>二、反射解释类型的语言,当程序加载到内存运行时,在某个过程中获取对象的类型、属性等信息方式称为反射。反射可以通过字符串调用对象属性、方法、导入模块。它是一个基于字符串的事件驱动程序。2.1具有反射能力的内置函数hasattr()>用于检测对象是否包含名为name的属性。如果有ReturnTrueifnotreturnFalseclassCls():attr1='attr1'def__init__(self,attr2):self.attr2=attr2defmeth1(self,num):returnnum**2obj=Cls('attribute2')print(hasattr(obj,'attr1'))#>>>Trueprint(hasattr(obj,'attr2'))#>>>Trueprint(hasattr(obj,'meth1'))#>>>True是否是一个变量或方法被视为“属性”,所以hasattr返回True#判断对象的属性是否是一个方法ifhasattr(obj,"attr1"):ifcallable(obj.attr1):#attr1是一个方法!else:#attr1不是方法而是属性else:#attr1不是属性getattr()>getattr()用于返回对象属性,或者方法getattr(object,name[,default])object--object.name--字符串,对象属性。default--默认返回值,如果不提供该参数,没有对应属性时会触发AttributeError。classA:def__init__(self):self.name='zhangjing'#self.age='24'defmethod(self):print"methodprint"Instance=A()print(getattr(Instance,'name,'notfind'))#如果Instance对象中有属性name,则打印self.name的值,否则打印'notfind'print(getattr(Instance,'age','notfind'))#如果有是Instance对象中的一个属性age打印self.age的值,否则打印'notfind'print(getattr(a,'method','default'))#如果有method方法,否则打印其地址,otherwiseprintdefaultprint(getattr(a,'method','default'))()#如果有method方法,则运行函数并打印Noneotherwiseprintdefault使用场景:obj=MyObject()forxin['foo','bar']:#obj.x()#毫无疑问这是一个错误。...所以我们可以使用getattrgetattr(obj,x)()来实现工厂方法用getattr:一个模块支持打印html、text、xml等格式,根据传递的formate参数不同,调用不同的函数实现几种格式inTheoutputofimportstatsoutdefoutput(data,format="text"):output_function=getattr(statsout,"output_%s"%format)returnoutput_function(data)在这个例子中,你可以去调用不同的方法statsout模块(用格式字符串实现output_%s)setattr()setattr()函数对应函数getattr(),用于设置属性值,属性不一定存在。setattr(object,name,value)object–对象。name--字符串,对象属性。值——属性值。>>classA(object):...bar=1...>>>a=A()>>>getattr(a,'bar')#获取属性栏值1>>>setattr(a,'bar',5)#设置属性bar值>>>a.bar5delattr()删除对象中的变量。注意:不能用于删除方法classPerson(object):def__init__(self,name):self.name=namedeftalk(self):print("%sistalking"%self.name)p=Person("laowang")delattr(p,"name")#删除name变量print(p.name)#此时会报错。世界上没有难的Python。如果有,说明你没有关注公众号。喜欢的朋友可以扫描二维码关注