首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时修饰类方法

在运行时修饰类方法
EN

Stack Overflow用户
提问于 2021-03-23 10:15:45
回答 1查看 146关注 0票数 0

我想装饰一个类方法,但是在运行时(我的意思是在方法之前不需要用@notation来指定装饰符)

请参阅标准方法装饰器的示例:

代码语言:javascript
复制
def method_decorator(func):
    def decorated(self, *args, **kwargs):
        print('decorator:', args, kwargs)
        return func(self,*args, **kwargs)
    return decorated

class Standard():
    @ method_decorator
    def decorated(self, *args, **kwargs):
        print('decorated: ', args, kwargs)

s = Standard()
s.decorated(1,2)

结果:

代码语言:javascript
复制
decorator: (1, 2) {}
decorated:  (1, 2) {}

所以我在运行时尝试了不同的方法:

代码语言:javascript
复制
class RunTime():
    def set_decorator_1(self, decorator):
        self.decorated = decorator(self.decorated)
    def set_decorator_2(self, decorator):
        RunTime.decorated = decorator(RunTime.decorated)
    def set_decorator_3(self, decorator):
        self.decorated = decorator(RunTime.decorated)
    def set_decorator_4(self, decorator):
        setattr(self, 'decorated', decorator(RunTime.decorated))
    def set_decorator_5(self, decorator):
        setattr(self, 'decorated', decorator(self.decorated))
    def decorated(self, *args, **kwargs):
        print('decorated: ', args, kwargs)

r = RunTime()
r.set_decorator_*(method_decorator)
r.decorated(1,2)

以下是产出:

  1. 装潢器没有正确装饰:

代码语言:javascript
复制
decorator: (2,) {}
decorated:  (1, 2) {}

instance.

  • Bad

  • 按预期工作,但是当调用set_decorator时,所有RunTime实例也会被修饰,这是我想要避免的,因为我只想装饰单个set_decorator RunTime

的方法。

代码语言:javascript
复制
decorator: (2,) {}
decorated:  (2,) {}

  1. 同3
  2. 同1

我还尝试了另一个装饰器,它可以很好地工作(使用set_decorator_1),但不允许我在其中访问self:

代码语言:javascript
复制
def method_decorator_runtime(func):
    def decorated( *args, **kwargs):
        print('decorator: ', args, kwargs)
        return func( *args, **kwargs)
    return decorated

是否有人知道如何在运行时对方法进行适当的修饰,并能够在装饰器中访问自己?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-14 06:46:19

我为您的问题找到的最接近的解决方案是使用带有参数的装饰器,在这里可以传递具有其方法修饰的对象的实例。

代码语言:javascript
复制
def method_decorator(self_eventually):
    def decorator(func):
        def decorated(*args, **kwargs):
            print('decorator:', repr(self_eventually), args, kwargs)
            return func(*args, **kwargs)
        return decorated
    return decorator

class RunTime():

    def set_decorator(self, decorator):
        self.decorated = decorator(self)(self.decorated)

    def decorated(self, *args, **kwargs):
        print('decorated:', repr(self), args, kwargs)

r = RunTime()
r.set_decorator(method_decorator)
r.decorated(1, 2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66761172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档