【问题标题】:Outputs from two decorators issue两个装饰器的输出问题
【发布时间】:2019-12-26 02:32:49
【问题描述】:

请帮助了解我如何接收来自两个装饰器的输出。 这是我的代码:

def check1(function1):

  def getver1():
    ver1 = 0.1
    return getattr(function1(ver1))

  return getver1()


def check2(function2):

  def getver2():
    ver2 = 0.2
    return getattr(function2(ver2))

  return getver2()

@check1
@check1
class ClassObj(object):

  def __init__(self, *args, **kwargs):
    print(args)
    print(kwargs)

因此,我只收到第二个的输出,但为什么呢?

('0.2')

【问题讨论】:

  • 您的两个装饰器似乎都在调用它们的内部函数而不是返回它们。 check1 应该以 return getver1 结束

标签: python python-3.x decorator python-decorators


【解决方案1】:

我认为您需要编辑您的代码。有相当多的错误,你使用了两次check1 而没有使用check2。您无法使用当前代码看到('0.2') 的输出。

另外,您以错误的方式使用类装饰器。这篇文章很好的参考:https://krzysztofzuraw.com/blog/2016/python-class-decorators.html

【讨论】:

    【解决方案2】:

    装饰器从上到下堆叠。类似代码

    @check1
    @check2
    class ClassObj(object):
        ...
    

    等价于

    class ClassObj(object):
        ...
    
    ClassObj = check1(check2(ClassObj))
    

    也就是说,你用check1装饰ClassObj,然后用check2装饰结果。

    但是,您遇到的问题是您的两个装饰器实际上都没有返回一个类。他们都使用给定类的 instancegetattr 进行(不正确的)调用。

    【讨论】:

    • 是的,但即使是对getattr 的正确调用也不太可能产生适合装饰器返回的值。
    • 我们离装饰师还有很长的路要走。但是,在到达print(args) 之前出现几处错误时,OP 如何获得声明的输出?
    • @quamrana 不知道,我也不是特别感兴趣。除了指出装饰器应该如何工作之外,代码确实有太多错误。
    猜你喜欢
    • 2021-07-07
    • 2016-03-23
    • 1970-01-01
    • 2016-10-05
    • 2011-05-18
    • 2019-05-11
    • 2015-05-12
    • 2011-07-09
    相关资源
    最近更新 更多