大話 python 之鴨子

pardon110發表於2019-10-01

python膠水用多了難免沾手,會帶來一些鴨子特性(行為表現像鴨子,認為它就是鴨子)。本文旨在講述,python一些不為人知的鴨子性,比如泛型函式,可呼叫類.... 。python相信函式,本身將裝飾器發揮到了極致,包括它的鴨子物件(非經典意義上的物件,與js有得一比)

類可呼叫

之前,一直奇怪python類的儘管不是真正意義上的類,但為什麼不用new,是早期遺留,還是有別的考慮。

  • php語境中,通常將具備函式特性的,諸如方法,靜態函式,可呼叫例項,普通函式,匿名函式等視為可呼叫物件。
  • python 有了個lambda,也是可呼叫物件,同時,python的類例項化形式,不用new,行為表現分明是函式呼叫鴨子。看官方指引, python類是可呼叫的,這意味著匿名函式出現的地方,類名在某種情況下也可以代替。

    Classes
    Classes are callable. These objects normally act as factories for new instances of themselves, but variations are possible for class types that override new(). The arguments of the call are passed to new() and, in the typical case, to init() to initialize the new instance.

import functools
from itertools import *
import pprint
class  Point: 
    def __init__(self, x, y): 
        self.x = x 
        self.y = y
data =  list(map(Point,  cycle(islice(count(),  3)),  islice(count(),  7)))  
print('Data:') 
pprint.pprint(data, width=35)  
print()

泛型函式

functools.singledispatch 本質上是一個帶有預設實現的,函式轉發器,對來路的資料進行了內部斷言,轉發至外部函式。

類裝飾器

某種意義上的代理繼承,用在抽象類與實現上,乾脆使用register掛載裝飾到新類

自省,反射?

inspect 模組從某種意義上有其它語言反射的特性。它可動態調整執行時的行為,或檢查程式的執行環境

謂詞函式

認為稱之條件函式或測試函式更為合適,返回布林值,非常適合攔截器,過濾器等應用場景

函式式介面

operator 內建運算子函式式介面,可以間接呼叫例項物件的方法,屬性。有點將運算子函式化味道,同時
具備php中的call_user_func這類介面函式特性。

abc抽象基類

hasattr() 檢查某些方法更加嚴格,為子類建立一些通用的 API,metaclass=abc.ABCMeta

方法外化

python 類中方法可以寫在類外,有點像golang(資料與操作集分開),似js,c++ 都可以將資料狀態與行為相分離,這在php或java這類語言看來,似乎有點反人類。它的類更合適認為是一個名稱空間,只是一個模板的接入點。

相關文章