python協議 Python 協議小總

2021-10-11 19:59:24 字數 1822 閱讀 7161

每個程式語言都有自己的最佳實踐.通常你不能套用別的語言來寫出pythonic的**.

python 是一門初學簡單,越學越難的語言.

在python的世界中, 萬物皆物件.當我們說某個物件是什麼型別時,在根本上其實指的是:這個物件滿足了該型別的特定介面規範,可以被當成這個型別來使用.

如何定義乙個物件的特定介面呢?

dunder methods, 即雙下劃線方法.

python 的物件定義了非常多的雙下劃線方法,比如__init__/__eq__/__hash__ 等等,接下來進行實戰中常見乙個小總結

__str__

當物件定義了以上協議,就可以使用str函式,列印自定義的結果

class foo:

def __str__(self):

return 'my name is bingo!'

print(foo())

__format__

將物件表示成字串,有利於開發者理解

# 額外定義展示格式:long/short.其中long列印出當前物件在記憶體中的位置

class foo:

def __format__(self, fmt):

if fmt == 'long':

return 'i am a foo instance, i stay at {}'.format(id(self))

elif fmt == 'short':

return 'i am a foo instance.'

f1 = foo()

f2 = foo()

print(''.format(f1))

# i am a foo instance, i stay at 139870957014152

print(''.format(f2))

# i am a foo instance.

__bool__

當物件定義了以上協議,在進行布林判斷時,使用自定義的邏輯

class foo:

def __bool__(self):

return true # 當進行布林判斷時,永遠返回true.僅僅是乙個示例,沒有實際價值

if foo():

print('yes')

# yes

__enter__和__exit__

當物件定義了以上兩種協議時,此物件可以作為上下文檔案管理器

__hash__和__eq__

當物件定義了以上兩種協議時, 此物件可以作為可雜湊物件,可以作為字典的鍵和集合的元素.

class visitrecord:

"""旅遊記錄"""

def __init__(self, first_name, last_name, phone_number, date_visited):

self.first_name = first_name

self.last_name = last_name

self.phone_number = phone_number

self.date_visited = date_visited

def __hash__(self):

return hash(

(self.first_name, self.last_name, self.phone_number)

def __eq__(self, other):

# 當兩條訪問記錄的名字與**號相等時,判定二者相等。

if isinstance(other, visitrecord) and hash(other) == hash(self):

return true

return false

python 協程 理解

協程的使用依賴於gevent 它封裝了greenlet 在使用的時候 主要是切斷當前程式執行,然後當收到訊號再次執行程式。在中斷中可以進行其它任務。程式import gevent def foo print running in foo gevent.sleep 0 print explicit c...

python學習 協程

在學習非同步io模型前,我們先來了解協程。協程,又稱微執行緒,纖程。英文名coroutine。協程的概念很早就提出來了,但直到最近幾年才在某些語言 如lua 中得到廣泛應用。子程式,或者稱為函式,在所有語言中都是層級呼叫,比如a呼叫b,b在執行過程中又呼叫了c,c執行完畢返回,b執行完畢返回,最後是...

python 執行緒,協程

本文 threading用於提供執行緒相關的操作。執行緒是應用程式中工作的最小單元,它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。threading 模組建立在 thread 模組之上。thread...