1. 程式人生 > >python自動化開發-[第八天]-面向對象高級篇與網絡編程

python自動化開發-[第八天]-面向對象高級篇與網絡編程

屬性字典 del log 工作 新增 subclass Coding ror play

今日概要:

  一、面向對象進階

    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自動化開發-[第八天]-面向對象高級篇與網絡編程