不一样的对象
isinstance(obj,cls) ? ?判斷實(shí)例在不在類里
1 class Foo: 2 pass 3 f1=Foo() 4 print(isinstance(f1,Foo)) 5 >>>Trueissubclss(sub,super) ? ? 判斷 第一個(gè)類 是不是 第二個(gè)類的 繼承 派生
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面向?qū)ο笾械姆瓷?#xff1a;通過(guò)字符串的形式操作對(duì)象相關(guān)的屬性。python中的一切事物都是對(duì)象(都可以使用反射)
hasattr(object,name):?判斷object中有沒(méi)有一個(gè)name字符串對(duì)應(yīng)的方法或?qū)傩?/p> 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): ?存在就獲取對(duì)應(yīng)的值 ?,不存在就報(bào)錯(cuò),(默認(rèn)值表示不在就返回)。
可以都類和函數(shù)使用
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 >>>123setaddr(x,y,v) ? ?設(shè)置屬性
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 >>>{}對(duì)自己進(jìn)行操作
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>?反射的機(jī)制
1 class FtpClient: 2 def __init__(self,addr): 3 print("正在連接服務(wù)器%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 >>>正在連接服務(wù)器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("執(zhí)行__getattr__") #找不到找這里 7 def __delattr__(self, item): 8 print("執(zhí)行__delattr__") 9 self.__dict__.pop(item) #在這里刪除 10 def __setattr__(self, key, value): 11 print("執(zhí)行__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 >>>執(zhí)行__setattr__ 19 >>>{'y': 10} 20 >>>執(zhí)行__delattr__ 21 >>>{}?包裝
二次加工=繼承+派生 ? ? 繼承的方式完成授權(quán)
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']授權(quán):授權(quán)是包裝的一個(gè)特性,?包裝一個(gè)類型通常是對(duì)已存在的類型的一些定制,這種做法可以新建,修改或刪除原有產(chǎn)品的功能。其它的則保持原樣。授權(quán)的過(guò)程,即是所有更新的功能都是由新類的某部分來(lái)處理,但已存在的功能就授權(quán)給對(duì)象的默認(rèn)屬性。
組合的方式完成授權(quán)
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\n") 15 r1.write("wen\n")六 描述符(__get__,__set__,__delete__)
??描述符是什么:描述符本質(zhì)就是一個(gè)新式類,在這個(gè)新式類中,至少實(shí)現(xiàn)了__get__(),__set__(),__delete__()中的一個(gè),這也被稱為描述符協(xié)議
__get__():調(diào)用一個(gè)屬性時(shí),觸發(fā)
__set__():為一個(gè)屬性賦值時(shí),觸發(fā)
__delete__():采用del刪除屬性時(shí),觸發(fā)
?注意事項(xiàng):
一 描述符本身應(yīng)該定義成新式類,被代理的類也應(yīng)該是新式類
二 必須把描述符定義成這個(gè)類的類屬性,不能為定義到構(gòu)造函數(shù)中
三 要嚴(yán)格遵循該優(yōu)先級(jí),優(yōu)先級(jí)由高到底分別是
1.類屬性
2.數(shù)據(jù)描述符
3.實(shí)例屬性
4.非數(shù)據(jù)描述符
5.找不到的屬性觸發(fā)__getattr__()
?-------------------------------------------------------------------------------------------------------------------------
#自省 hasattr(obj,"屬性")#obj.屬性 是否存在 getattr(obj,"屬性")#獲取obj.屬性 不存在則報(bào)錯(cuò) getattr(obj,"屬性","默認(rèn)值")#獲取obj.屬性 不存在不會(huì)報(bào)錯(cuò),返回那個(gè)默認(rèn)值 setattr(obj,"屬性","屬性的值")#obj.屬性=屬性的值 delattr(obj,"屬性")#del obj.屬性#__getattr__,__setattr__,__delattr__ #obj點(diǎn)的方式去操作屬性時(shí)觸發(fā)的方法 __getattr__:obj.屬性 不存在時(shí)觸發(fā) __setattr__:obj.屬性=屬性的值 時(shí)觸發(fā) __delattr__:del obj.屬性 時(shí)觸發(fā)#__getitem__,__setitem__,__delitem__ #obj[]的方式去操作屬性時(shí)觸發(fā)的方法 __getitem__:obj["屬性"] 時(shí)觸發(fā) __setitem__:obj["屬性"]=屬性的值 時(shí)觸發(fā) __delitem__:del obj["屬性"] 時(shí)觸發(fā)#_get__,__set__,delete__ #描述就是一個(gè)新式類,這個(gè)類至少要實(shí)現(xiàn)上述三個(gè)方法的一個(gè) class 描述符:def __get__(self):passdef __set__(self, instance, value):passdef __delete__(self, instance):pass class 類:name=描述符() obj=類() obj.name #get obj.name="szw" #set del obj.name #delete#__del__:析構(gòu)方法 #垃圾回收時(shí)觸發(fā)
轉(zhuǎn)載于:https://www.cnblogs.com/shizhengwen/p/6222181.html
總結(jié)
- 上一篇: Java 监听器,国际化
- 下一篇: NB-IOT连接移动onenet平台流程