回答
你不能像使用javascript的原型屬性那樣直接編輯類,如果你繼承它們,它會更好。這讓你添加你想要的功能,而不是強迫它在任何地方使用。
好的,我該如何編程?我想將這個修改應用到很多類。我不想全部通過手工擴展。 – 2010-01-29 21:27:19
您可能想要使用返回該類的修改版本的類裝飾器。那麼你只需要在每個應該修改的類的頂部添加「@yourdecorator」。 – AndiDog 2010-01-29 21:32:06
內置的類不能被修改,但是你可以用同一個名字「隱藏」一個內置的類(或者任何其他的類)。
例如,假設改變是將一組新的屬性「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)
來使用「假」類。
你怎麼能超載更改類的\ _ \ _ add__方法? – 2010-01-29 22:23:13
完全相同的方式。 – 2010-01-30 00:30:13
雖然你可以通過重新分配它們的屬性來爲python代碼中定義的類執行此操作(它不適用於內置函數),但實際上並不這樣做。只需子類並使用子類,或者編寫以該類的實例作爲參數而不是添加自己的方法的函數。做你必須介意的事情會導致尷尬,脆弱的代碼,特別是如果最終同時使用多個庫來嘗試對同一類執行此操作。
是否有一個實際的問題,你試圖解決這個問題?
子類:
class int(int):
def foo(self):
print "foo"
int(2).foo()
- 1. 修改Boost Python包裝類?
- 2. 修改python pytecode
- 3. Python修改.xar
- 4. Python Tkinter,從類外修改文本
- 5. Python中的繼承類變量修改
- 6. 在Tkinter中修改窗口類(Python 3)
- 7. 在Python類中攔截屬性修改
- 8. Ruby - 修改類
- 9. 修改Kotlin類
- 10. 修改python程序(python 2.7)
- 11. Python代碼修改
- 12. 修改qscintilla python lexar
- 13. JavaScript/jQuery類修改
- 14. 修改類功能
- 15. 修改tweepy流類
- 16. 修改基類中
- 17. 不CGLIB修改類
- 18. jQuery和修改類
- 19. 有沒有辦法在Python中的類方法中修改類?
- 20. Python:修改醃漬對象
- 21. 修改dataframe行 - 熊貓Python
- 22. 修改Python字典鍵
- 23. Python的menuOptions修改設置
- 24. 用python修改gzip文件
- 25. Python修改生成器
- 26. Python的讀 - 修改 - 寫行
- 27. 自我修改python腳本
- 28. 在Python中修改變量
- 29. 的Python:修改內容
- 30. 的Python:修改列表
有什麼用呢? – 2010-01-29 21:36:44
實現Python的污點模式。 – 2010-01-29 21:50:08
您還需要能夠重新實現語言中的所有操作符。我認爲你不會做你想做的事。 – 2010-01-29 22:19:31