python - 是否可以将我自己的装饰器应用于 Python 中的内置方法?

标签 python decorator

我刚刚接触到 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/

相关文章:

python - 使用 BeautifulSoup 用 Python 抓取 aspx 网页

python - Pandas:从 df 的列中的值中删除第一个和最后一个元素

python - Python Flask Web 服务中带有回调的长异步计算

Scala 中的 Python 风格装饰器

python - 装饰迭代器以在 python 中调用 next 之前更改值的好方法是什么?

javascript - 如何在 Django 应用程序中的 Javascript、Python 和 CSS 之间共享配置数据?

python - 如何使用 pprint 打印而不换行

java - 装饰器模式,编译器不允许类型传播

wpf - 创建自定义 FrameworkContentElement 以在 WPF 中的文本上添加对角线

python - 对象没有被传递到 flask 路由中