2017-02-22 44 views
2

有沒有辦法讓猴子補丁的核心python類? 東西沿着線:有沒有辦法讓猴子補丁的核心python類?

class Boo: 
    def is_empty(self) : return not self 

list.is_empty = Boo.is_empty 

TypeError: can't set attributes of built-in/extension type 'list'

我不想把它擴大,我想猴子修補它。


對不起,我的意思是「猴子補丁」。

+5

你說的「管型」是什麼意思?你的意思是「猴子補丁」嗎?如果是這樣,不,你不能那樣做。 – kindall

+1

@ kindall:我認爲這是* duck-type *和* duct tape *之間的混合。 –

+0

如果你認爲猴子補丁是可能的,但你必須很好地理解CPython的內部結構:https://gist.github.com/mahmoudimus/295200 –

回答

3

如果你指的monkey patching代替duck typing,那麼,你可以用​​做得一樣@ juanpa.arrivillaga在評論中建議:https://gist.github.com/mahmoudimus/295200

但即使如此,我會強烈建議反對它,因爲它可以如果他們導入你的模塊,會破壞其他人的代碼。想象一下,如果每個人都在開始搞亂內部結構,你將無法安全地導入任何東西!

你應該做的卻是繼承的Python類:

class Boo(list): 
    def is_empty(self): 
     return not self 

>>> my_list = Boo([1, 2, 3, 4, 5]) 
>>> my_list2 = Boo([]) 
>>> my_list.is_empty() 
False 
>>> my_list2.is_empty() 
True 
>>> my_list2.append(5) 
>>> my_list2.is_empty() 
False 
>>> my_list2 
[5]