isinstance(obj,cls) 判断实例在不在类里
1 class Foo: 2 pass 3 f1=Foo() 4 print(isinstance(f1,Foo)) 5 >>>True
issubclss(sub,super) 判断 第一个类 是不是 第二个类的 继承 派生
1 class Foo: 2 pass 3 class bar(Foo): 4 pass 5 print(issubclass(bar,Foo)) 6 >>>True
反射
hasattr(object,name)
getaddr(object,name,default=None)
setaddr(x,y,v)
delattr(xy)
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
hasattr(object,name): 判断object中有没有一个name字符串对应的方法或属性
1 class Foo: 2 x=10 3 def __init__(self,name): 4 self.name=name 5 def school(self): 6 print("oldboy") 7 f1=Foo("szw") 8 print(hasattr(f1,"name")) 9 >>>True
getaddr(object,name,default=None): 存在就获取对应的值 ,不存在就报错,(默认值表示不在就返回)。
可以都类和函数使用
1 class Foo: 2 x=10 3 def __init__(self,name): 4 self.name=name 5 def school(self): 6 print("oldboy") 7 f1=Foo("szw") 8 print(getattr(f1,"name")) 9 print(getattr(f1,"age",123)) 10 >>>szw 11 >>>123
setaddr(x,y,v) 设置属性
1 class Foo: 2 x=10 3 def __init__(self,name): 4 self.name=name 5 def school(self): 6 print("oldboy") 7 f1=Foo("szw") 8 setattr(f1,"name","alex") 9 print(f1.__dict__) 10 >>>{'name': 'alex'}
delattr(xy) 删除属性
1 class Foo: 2 x=10 3 def __init__(self,name): 4 self.name=name 5 def school(self): 6 print("oldboy") 7 f1=Foo("szw") 8 delattr(f1,"name") 9 print(f1.__dict__) 10 >>>{}
对自己进行操作
1 import sys 2 def s1(): 3 print ('s1') 4 def s2(): 5 print ('s2') 6 this_module = sys.modules[__name__] 7 print(hasattr(this_module, 's1')) 8 print(getattr(this_module, 's2')) 9 >>>True 10 >>><function s2 at 0x0108D300>
反射的机制
1 class FtpClient: 2 def __init__(self,addr): 3 print("正在连接服务器%s"%addr) 4 self.addr=addr
1 from duixiang import FtpClient 2 f1=FtpClient("192.168.1.1") 3 if hasattr(f1,"get"): 4 func_get=getattr(f1,"get") 5 func_get() 6 else: 7 print("处理其他逻辑") 8 >>>正在连接服务器192.168.1.1 9 >>>处理其他逻辑
__setattr__
__delattr__
__getaddr__
1 class Foo: 2 x=1 3 def __init__(self,y): 4 self.y=y 5 def __getattr__(self, item): 6 print("执行__getattr__") #找不到找这里 7 def __delattr__(self, item): 8 print("执行__delattr__") 9 self.__dict__.pop(item) #在这里删除 10 def __setattr__(self, key, value): 11 print("执行__setattr__") 12 self.__dict__[key]=value #在这里赋值 13 f1=Foo(10) 14 f1.y 15 print(f1.__dict__) 16 del f1.y 17 print(f1.__dict__) 18 >>>执行__setattr__ 19 >>>{'y': 10} 20 >>>执行__delattr__ 21 >>>{}
包装
二次加工=继承+派生 继承的方式完成授权
1 class List(list): 2 def append(self,p_object): 3 if type(p_object) is str: 4 super().append(p_object) 5 6 obj=List("shizhengwen") 7 obj.append("123") 8 obj.append(456) 9 print(obj) 10 >['s', 'h', 'i', 'z', 'h', 'e', 'n', 'g', 'w', 'e', 'n', '123']
授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。
组合的方式完成授权
1 import time 2 class Open: 3 def __init__(self,filename,mode="r+",encording="utf-8"): 4 self.file=open(filename,mode,encoding="utf-8") 5 self.mode=mode 6 self.encording=encording 7 def write(self,tiem): 8 t=time.strftime("%Y-%m-%d-%X") 9 self.file.write("%s %s"%(t,tiem)) 10 def __getattr__(self, item): 11 print(item) 12 return getattr(self.file,item) 13 r1=Open("a.txt","r+") 14 r1.write("741 ") 15 r1.write("wen ")
六 描述符(__get__,__set__,__delete__)
描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
__get__():调用一个属性时,触发
__set__():为一个属性赋值时,触发
__delete__():采用del删除属性时,触发
注意事项:
一 描述符本身应该定义成新式类,被代理的类也应该是新式类
二 必须把描述符定义成这个类的类属性,不能为定义到构造函数中
三 要严格遵循该优先级,优先级由高到底分别是
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符
5.找不到的属性触发__getattr__()
-------------------------------------------------------------------------------------------------------------------------
#自省 hasattr(obj,"属性")#obj.属性 是否存在 getattr(obj,"属性")#获取obj.属性 不存在则报错 getattr(obj,"属性","默认值")#获取obj.属性 不存在不会报错,返回那个默认值 setattr(obj,"属性","属性的值")#obj.属性=属性的值 delattr(obj,"属性")#del obj.属性 #__getattr__,__setattr__,__delattr__ #obj点的方式去操作属性时触发的方法 __getattr__:obj.属性 不存在时触发 __setattr__:obj.属性=属性的值 时触发 __delattr__:del obj.属性 时触发 #__getitem__,__setitem__,__delitem__ #obj[]的方式去操作属性时触发的方法 __getitem__:obj["属性"] 时触发 __setitem__:obj["属性"]=属性的值 时触发 __delitem__:del obj["属性"] 时触发 #_get__,__set__,delete__ #描述就是一个新式类,这个类至少要实现上述三个方法的一个 class 描述符: def __get__(self): pass def __set__(self, instance, value): pass def __delete__(self, instance): pass class 类: name=描述符() obj=类() obj.name #get obj.name="szw" #set del obj.name #delete #__del__:析构方法 #垃圾回收时触发