這有可能在一定意義;這取決於你的意思。這樣的裝飾語法...
@dec
def foo():
pass
真的只是糖這樣的:
def foo():
pass
foo = dec(foo)
所以沒有什麼使用上的全局命名空間的預定義功能的裝飾阻止你。
func = dec(func)
但是內置類的方法,生活在類的命名空間,該命名空間不能直接修改,如chepner已經指出。這是件好事,因爲它可以確保類型爲str
的對象的行爲符合預期!但是,你可以子海峽和裝飾方法那樣:
>>> def remove_empty(fn):
... def filtered(*args, **kwargs):
... return filter(lambda x: x != '', fn(*args, **kwargs))
... return filtered
...
>>> class WeirdString(str):
... @remove_empty
... def split(self, *args, **kwargs):
... return super(WeirdString, self).split(*args, **kwargs)
...
>>> 'This decorator is unnecessary\n\n\n'.split('\n')
['This decorator is unnecessary', '', '', '']
>>> WeirdString('This decorator is unnecessary\n\n\n').split('\n')
['This decorator is unnecessary']
或者更直接(所以更多的裝飾使用的靈):
>>> class WeirdString2(str):
... split = remove_empty(str.split)
...
>>> WeirdString2('This decorator is unnecessary\n\n\n').split('\n')
['This decorator is unnecessary']
在這種的情況下,特別是的例子,我更喜歡一個明確的過濾器。但我可以想象,例如,一個內置類的子類,它可以執行一些memoization或類似的事情。
你希望split()方法總是在應用程序的每次調用中刪除空字符串? –
好點。這可能是一個不好的例子,但我仍然想知道它是否可能... – muskrat