python自動化開發-[第八天]-面向對象高級篇與網絡編程
今日概要:
一、面向對象進階
1、isinstance(obj,cls)和issubclass(sub,super)
2、__setattr__,__getattr__,__delattr__
3、二次加工標準類型(包裝/授權)
4、__setitem__,__getitem__,__delitem__
5、__str__,__repr__,__format
6、__next__,__iter__實現叠代器協議
7、__doc__
8、__del__析構函數
9、__enter__,__exit__
10、__call__
11、metaclass 元類
二、網絡編程
1、osi七層
2、socket是什麽
3、套接字的工作流程
4、基於tcp的套接字
5、基於udp的套接字
6、recv和recvfrom的區別
7、粘包現象
8、socketserver解決並發
一、isinstance和issubclass
isinstance(obj,cls)檢查是否obj是否是類 cls 的對象
例子:
class Foo(object): pass obj = Foo() isinstance(obj, Foo)
issubclass(sub, super)檢查sub類是否是 super 類的派生類
例子:
class Foo: pass class Go(Foo): pass print(issubclass(Go,Foo)) ‘‘‘ 輸出 True ‘‘‘
二、__setattr__,__getattr__,__delattr__
#!/usr/bin/python # -*- coding:utf-8 -*- #特殊getattr 為 必須類的屬性不存在 才執行 class Foo: def __init__(self,x): self.x代碼示例= x def __setattr__(self, key, value): self.__dict__[key] = value #正確都使用方法 #setattr(self,key,value) #進入無限遞歸 def __getattr__(self, item): print (‘getatt‘) def __delattr__(self, item): #del self.item 進入無限遞歸 self.__dict__.pop(item) #__setattr__修改或者添加屬性才會執行 g = Foo(10) print (g.x) print(g.__dict__) #setattr重寫了,如果__setattr__什麽都沒寫,除非直接操作屬性字典,否則永遠無法賦值 #__delattr__刪除屬性才會觸發 g.__dict__[‘y‘] = 2 #可以用這種方式直接修改屬性字典,完成添加或修改屬性的操作 print (g.__dict__) g.xxxxxx #使用.調用屬性,但屬性不存在但時候,才觸發 ‘‘‘ 輸出: 10 {‘x‘: 10} {‘x‘: 10, ‘y‘: 2} getatt ‘‘‘ attr示例
三、二次加工標準類型(包裝/授權)
包裝:python為大家提供了標準數據類型,以及豐富的內置方法,其實在很多場景下我們都需要基於標準數據類型來定制我們自己的數據類型,新增/改寫方法,這就用到了我們剛學的繼承/派生知識(其他的標準類型均可以通過下面的方式進行二次加工
#繼承list類的所有屬性,可派生出自己新的比如append和mid方法 class List(list): def __init__(self,item,tag=False): super().__init__(item) self.tag = tag def append(self, p_object): print (‘派生都自己都屬性+類型檢查‘) if not isinstance(p_object,str): raise TypeError(‘%s must be str‘ %(p_object)) def mid(self): print(‘自定義屬性‘) mid_index=len(self) // 2 return self[mid_index] def clear(self): if not self.tag : raise PermissionError(‘%s permission ‘) else: super().clear() self.tag = False l = List([1,2,3]) print (l) l.append(‘4‘) print (l) # l.tag = True # l.clear()二次加工標準類型基於繼承實現
授權:授權是包裝的一個特性, 包裝一個類型通常是對已存在的類型的一些定制,這種做法可以新建,修改或刪除原有產品的功能。其它的則保持原樣。授權的過程,即是所有更新的功能都是由新類的某部分來處理,但已存在的功能就授權給對象的默認屬性。
實現授權的關鍵點就是覆蓋__getattr__方法
#!/usr/bin/python # -*- coding:utf-8 -*- import time class Filehandle: def __init__(self,filename,mode=‘r‘,encoding=‘utf-8‘): self.file = open(filename,mode=mode,encoding=encoding) def write(self,line): t = time.strftime(‘%Y-%m-%d %X‘) self.file.write(‘%s %s‘ %(t,line)) def __getattr__(self, item): return getattr(self.file,item) f1 = Filehandle(‘b.txt‘,‘w+‘,encoding=‘utf-8‘) f1.write(‘123123‘) #如下方法為非重寫方法通過__getattr和反射 去原來的方法裏查找 f1.seek(0) print (f1.read()) f1.close()授權例子1
python自動化開發-[第八天]-面向對象高級篇與網絡編程