我刚刚接触到 Python 装饰器。只是出于兴趣,你能以某种方式将你自己的装饰器应用于内置对象方法吗?假设我想应用这个:
def remove_empty(fn):
def filtered():
return filter(lambda x: x != '', fn())
return filtered
对此:
some_string.split('\n')
为了删除空字符串。是否可以?甚至是个好主意?
最佳答案
从某种意义上说这是可能的;这取决于你的意思。像这样的装饰器语法...
@dec
def foo():
pass
真的只是糖:
def foo():
pass
foo = dec(foo)
因此,没有什么可以阻止您对全局命名空间中的预定义函数使用装饰器。
func = dec(func)
但是内置类的方法存在于该类的命名空间中,不能直接修改该命名空间,如chepner已经指出了。这是一件好事,因为它确保 str
类型的对象将按预期运行!但是,您可以继承 str 并以这种方式修饰该方法。 (以下在 Python 2 中有效;在 Python 3 中,将 filter
的输出传递给列表。super
的工作方式也可能略有不同;我将发布一个 Python 3以后更新。)
>>> 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或类似的东西。
关于python - 是否可以将我自己的装饰器应用于 Python 中的内置方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476402/