面像对象高级
isinstance:判断某个对像是否是某个类产生的
class Foo: pass obj=Foo() # print(isinstance(obj,Foo)) # 推荐使用该函数来判断一个函数的类型 # print(type(obj) is Foo) # print(isinstance('abc',str)) #判断是否是字符串类 # print(isinstance(123,int)) #判断是否是数字类 print(issubclass(Foo,object)) #所有新生类的基类都是object
重点!!!!!
反射: 通过字符串来操作类与对象的属性,这种操作称为反射。
class People: country="China" def __init__(self,name): self.name=name def tell(self): print('%s is aaa' %self.name) obj=People('egon')
1,hasattr #判断某个属性在不在一个类里或者一个对象有没有某个对象
print(hasattr(People,'country')) print('country' in People.__dict__) print(hasattr(obj,'name')) print(hasattr(obj,'country')) print(hasattr(obj,'tell'))
2,getattr #从类或者对象里拿到某个属性
x=getattr(People,'country1',None) #从类里拿到某个属性 print(x) f=getattr(obj,'tell',None)#obj.tell #从对象里拿到某个属性 print(f == obj.tell) f() obj.tell()
3,setattr #在类里增加属性
People.x=111 setattr(People,'x',111) #增加x=111的数据属性 print(People.x) obj.age=18 setattr(obj,"age",18) print(obj.__dict__)
4,delattr #删除属性
del People.country delattr(People,"country") print(People.__dict__) del obj.name delattr(obj,"name") print(obj.__dict__)
以上四种方法可以处理字符串类型的命令,所以我们可以利用这个特性做很多事
比如下面这种:
class Foo: def run(self): while True: cmd=input('cmd>>: ').strip() #让用户输入命令 # print('%s run...' %cmd) if hasattr(self,cmd): #因为可以处理字符串类型的命令,所以可以直接调用 func=getattr(self,cmd) func() def download(self): print('download....') def upload(self): print('upload...') # obj=Foo() # obj.run()
描述符 __get__() __set__() __delete__() __get__():调用一个属性时才触发 __set__():为一个属性赋值时触发 __delete__():采用del删除属性时触发