2010-01-29 64 views
2

我想修改Python中的所有類。例如str和int以及像Person(object)這樣的其他類。修改Python類

我想給它們添加一個屬性並改變它的方法的工作方式。

這是最好的方法嗎?元類?

+2

有什麼用呢? – 2010-01-29 21:36:44

+0

實現Python的污點模式。 – 2010-01-29 21:50:08

+2

您還需要能夠重新實現語言中的所有操作符。我認爲你不會做你想做的事。 – 2010-01-29 22:19:31

回答

0

你不能像使用javascript的原型屬性那樣直接編輯類,如果你繼承它們,它會更好。這讓你添加你想要的功能,而不是強迫它在任何地方使用。

+0

好的,我該如何編程?我想將這個修改應用到很多類。我不想全部通過手工擴展。 – 2010-01-29 21:27:19

+0

您可能想要使用返回該類的修改版本的類裝飾器。那麼你只需要在每個應該修改的類的頂部添加「@yourdecorator」。 – AndiDog 2010-01-29 21:32:06

1

內置的類不能被修改,但是你可以用同一個名字「隱藏」一個內置的類(或者任何其他的類)。

例如,假設改變是將一組新的屬性「foobar」添加到它們的初始值爲23,並且對這些類的每個都添加了一個新屬性「murf」,其初始值爲45.這裏有一種方法:

def changedclass(cls): 
    def __init__(self, *a, **k): 
    cls.__init__(self, *a, **k) 
    self.murf = 45 
    return type(cls.__name__, (cls,), {'foobar': 23, '__init__': __init__}) 

def changemany(changed, classes_by_module): 
    for module, classnames in classes_by_module.iteritems(): 
    for name in classnames: 
     cls = getattr(module, name) 
     subcls = changed(cls) 
     setattr(module, name, subcls) 

import __builtin__ 
import mymod 
changemany(changedclass, {__builtin__: ('int', 'str'), mymod: ('Person',)}) 

注意,像「僑」,23裸露的文字仍然屬於真正類 - 有沒有辦法改變這種狀況;您需要使用str('ciao')int(23)來使用「假」類。

+0

你怎麼能超載更改類的\ _ \ _ add__方法? – 2010-01-29 22:23:13

+0

完全相同的方式。 – 2010-01-30 00:30:13

3

雖然你可以通過重新分配它們的屬性來爲python代碼中定義的類執行此操作(它不適用於內置函數),但實際上並不這樣做。只需子類並使用子類,或者編寫以該類的實例作爲參數而不是添加自己的方法的函數。做你必須介意的事情會導致尷尬,脆弱的代碼,特別是如果最終同時使用多個庫來嘗試對同一類執行此操作。

是否有一個實際的問題,你試圖解決這個問題?

0

子類:


class int(int): 
    def foo(self): 
    print "foo" 

int(2).foo()