那就好好理清楚唄。
在我們開始探索如何寫一個Pythonic物件之前,讓我們先弄清楚這個術語的含義它不是關於PEP8和尊重其規則來編寫漂亮的python程式碼;而是關於編寫物件,最大限度地使用Python資料模型的概念,因此它們可以像Python標準庫物件一樣被自然地使用。
其思想是將Python ADN注入到我們的使用者定義物件中,使它們發生變異,並表現為本地Python物件為此,我們將實現一個向量類來表示多維向量。
下面的程式碼用最小的實現表示Vector類。向量由其座標表示。
向量座標儲存在浮點陣列中;請注意將陣列中的元素型別強制設定為浮點的array type=“d”。我們可以將任何iterable傳遞給Vector的建構函式,因為陣列的建構函式用作接受任何iterable(元組、列表等)的內部容器。
當我們列印一個向量物件本身時,注意我們得到它的引用(CPython的記憶體地址)而不是它的座標。讓我們透過在類中實現_str_方法來更改它,使其具有更友好的輸出,例如(x,y,z,…)。
當我們列印一個向量物件本身時,注意我們得到它的引用(CPython的記憶體地址)而不是它的座標。讓我們透過在類中實現_str_方法來更改它,使其具有更友好的輸出,例如(x,y,z,…)注意,我們使用了從陣列建立的元組的字串表示。
__str_不是Python資料模型用於列印物件的唯一方法;_repr_還用於提供更面向除錯目的的物件表示可以計算此表示以使用eval函式建立相同的物件。
在前面的程式碼塊中,請注意,與eval一起使用時repr的返回值允許建立新向量reprlib的使用允許我們在陣列包含太多元素的情況下不列印陣列的所有元素,並用就像向量v2。
為了確保我們可以在向量上迴圈,並且可以將它們解包,我們需要使它們可迭代為此,必須向我們的類中新增_iter_方法。
為了能夠透過將物件賦給len()函式來獲得向量內的座標數,必須將_Len_方法新增到類中。
在不調整類以支援比較的情況下,應用於兩個向量物件的==運算子將比較它們的引用。若要更改此行為,必須實現“eq”方法。在我們的例子中,兩個向量是相等的,當且僅當它們具有相同的座標且具有相同的順序。
透過呼叫len()函式來使用len方法。
透過將self和其他引數傳遞給zip函式來使用iter方法,zip函式接受iterable作為引數。
Pythonic絕對值
對於此示例,我們使用該 __abs__ 方法返回由以下表達式定義的向量的歐幾里得範數:
對於向量類的當前實現,我們在計算向量的布林值時有以下行為。
在我們的類中,如果沒有bool方法,對bool()函式的呼叫將引用該方法如果長度等於0,則物件的計算結果為false-否則,其計算結果為true。
讓我們透過實現一個方法來改變這種行為,如果向量歐幾里德範數與0不同,則讓它返回True,否則返回false。
Pythonic切片
Python中的切片旨在透過指示要檢索的元素的索引或透過指示切片,從初始集合中獲取子集。
一個物件的切片返回同一型別的另一個物件。getitem方法是要更新的方法,以使向量物件具有這種能力。
注意,透過使用Slicing,返回的物件也是一個向量物件。
我們在本教程中實現的Dunder方法並不是唯一可以使用的方法其他的,如位元組、雜湊、getatrr和格式可以用來改變使用者定義物件的行為這些方法並不是每次定義新類時都要實現的,這取決於需要,這是Python資料模型的優點。
那就好好理清楚唄。
在我們開始探索如何寫一個Pythonic物件之前,讓我們先弄清楚這個術語的含義它不是關於PEP8和尊重其規則來編寫漂亮的python程式碼;而是關於編寫物件,最大限度地使用Python資料模型的概念,因此它們可以像Python標準庫物件一樣被自然地使用。
其思想是將Python ADN注入到我們的使用者定義物件中,使它們發生變異,並表現為本地Python物件為此,我們將實現一個向量類來表示多維向量。
下面的程式碼用最小的實現表示Vector類。向量由其座標表示。
向量座標儲存在浮點陣列中;請注意將陣列中的元素型別強制設定為浮點的array type=“d”。我們可以將任何iterable傳遞給Vector的建構函式,因為陣列的建構函式用作接受任何iterable(元組、列表等)的內部容器。
當我們列印一個向量物件本身時,注意我們得到它的引用(CPython的記憶體地址)而不是它的座標。讓我們透過在類中實現_str_方法來更改它,使其具有更友好的輸出,例如(x,y,z,…)。
當我們列印一個向量物件本身時,注意我們得到它的引用(CPython的記憶體地址)而不是它的座標。讓我們透過在類中實現_str_方法來更改它,使其具有更友好的輸出,例如(x,y,z,…)注意,我們使用了從陣列建立的元組的字串表示。
__str_不是Python資料模型用於列印物件的唯一方法;_repr_還用於提供更面向除錯目的的物件表示可以計算此表示以使用eval函式建立相同的物件。
在前面的程式碼塊中,請注意,與eval一起使用時repr的返回值允許建立新向量reprlib的使用允許我們在陣列包含太多元素的情況下不列印陣列的所有元素,並用就像向量v2。
Python迭代為了確保我們可以在向量上迴圈,並且可以將它們解包,我們需要使它們可迭代為此,必須向我們的類中新增_iter_方法。
Python長度計算為了能夠透過將物件賦給len()函式來獲得向量內的座標數,必須將_Len_方法新增到類中。
Python的比較在不調整類以支援比較的情況下,應用於兩個向量物件的==運算子將比較它們的引用。若要更改此行為,必須實現“eq”方法。在我們的例子中,兩個向量是相等的,當且僅當它們具有相同的座標且具有相同的順序。
讓我們花點時間分析一下新的方法:透過呼叫len()函式來使用len方法。
透過將self和其他引數傳遞給zip函式來使用iter方法,zip函式接受iterable作為引數。
Pythonic絕對值
對於此示例,我們使用該 __abs__ 方法返回由以下表達式定義的向量的歐幾里得範數:
Pythonic布林求值對於向量類的當前實現,我們在計算向量的布林值時有以下行為。
在我們的類中,如果沒有bool方法,對bool()函式的呼叫將引用該方法如果長度等於0,則物件的計算結果為false-否則,其計算結果為true。
讓我們透過實現一個方法來改變這種行為,如果向量歐幾里德範數與0不同,則讓它返回True,否則返回false。
Pythonic切片
Python中的切片旨在透過指示要檢索的元素的索引或透過指示切片,從初始集合中獲取子集。
一個物件的切片返回同一型別的另一個物件。getitem方法是要更新的方法,以使向量物件具有這種能力。
注意,透過使用Slicing,返回的物件也是一個向量物件。
結論我們在本教程中實現的Dunder方法並不是唯一可以使用的方法其他的,如位元組、雜湊、getatrr和格式可以用來改變使用者定義物件的行為這些方法並不是每次定義新類時都要實現的,這取決於需要,這是Python資料模型的優點。