不一样的对象
isinstance(obj,cls) ? ?判斷實例在不在類里
1 class Foo: 2 pass 3 f1=Foo() 4 print(isinstance(f1,Foo)) 5 >>>Trueissubclss(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 >>>Truegetaddr(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 >>>123setaddr(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\n") 15 r1.write("wen\n")六 描述符(__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):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__:析構方法 #垃圾回收時觸發
轉載于:https://www.cnblogs.com/shizhengwen/p/6222181.html
總結
- 上一篇: Java 监听器,国际化
- 下一篇: NB-IOT连接移动onenet平台流程