2017-03-23 24 views
1

我知道如果你創建自己的對象,你可以在那個對象上定義你自己的方法。如何在Python中定義後綴函數?

my_object_instance.mymethod()

我也知道,你可以定義與infix包綴功能。

obj1 |func| obj2

我想是定義接受後綴符號現有類型的功能的能力。

例如,給出一個列表l我們可能想檢查它是否被排序。定義一個典型的功能可能給我們

if is_sorted(l): #dosomething 

,但它可能是更地道,如果能寫

if l.is_sorted(): #dosomething 

這是可能的,而無需創建一個自定義類型?

+0

如果你想要的是一個接受類型作爲參數的函數,那麼你不需要做任何事情;類型是Python中的第一類對象 –

+1

Postfix表示法是別的。 – kindall

回答

0

正確的方法是繼承,通過繼承list並添加新功能來創建自定義類型。 Monkeypatching不是Python的強項。但是因爲你特意問了:

這可能沒有創建一個自定義類型?

什麼kindall mentioned的立場,Python不允許它。但由於實現中沒有任何內容是真正的只讀,所以您可以通過在類字典中進行黑客來近似得出結果。

>>> def is_sorted(my_list): 
...  return sorted(my_list) == my_list 
... 
>>> import gc 
>>> gc.get_referents(list.__dict__)[0]['is_sorted'] = is_sorted 
>>> [1,2,3].is_sorted() 
True 
>>> [1,3,2].is_sorted() 
False 

新的「方法」將出現在vars(list),名稱將在那裏在dir([]),並且它也將提供/可用在其上之前施加的猴補丁創建實例。

此方法使用garbage collector interface通過類mappingproxy獲得對基礎字典的引用。通過引用計數進行垃圾回收是一個CPython實現細節。只要說這是危險的/脆弱的,你不應該在任何嚴肅的代碼中使用它。

如果你喜歡這種功能,你可能喜歡ruby作爲一種編程語言。

+0

謝謝!太棒了 – Manny

0

Python通常不允許對內置類型進行猴子修補,因爲公共內置類型不是用Python編寫的(而是C),並且不允許修改類字典。您必須將它們繼承以按照需要添加方法。