每個程式語言都有自己的最佳實踐.通常你不能套用別的語言來寫出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...