gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:55:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com