【问题标题】:Accessing a decorated class访问装饰类
【发布时间】:2013-11-06 11:52:30
【问题描述】:

我继承了一个项目。我不太擅长装饰器,但我正在学习!

我有 2 个班级,两个班级都有装饰。它们位于单独的文件中。我想在class1中的一个方法中从class2调用一个类方法。像这样的:

@class_decorator
class Class2(object):

    @classmethod
    def generator(cls):
    for s in my_stuff:
        yield s

@class_decorator
class Class1(object):

    def __init__(self):
        self.my_list = [1,2,3]

    def some_funct(self):
        for a,b in zip(self.my_list, Class2.generator()):
            print "{} {}".format(a,b)

我得到一个 AttributeError,NoneType 没有属性生成器

这是因为 Class2 被装饰了吗?我不能在 Class2 上调用类方法吗?

【问题讨论】:

    标签: python class decorator


    【解决方案1】:
    @class_decorator
    class Class2(object):
    

    (技术警告除外)完全等同于

    class Class2(object):
        ...
    Class2 = class_decorator(Class2)
    

    (技术警告是,如果 Class2 修改了 class_decorator,那么这两个 可能会有所不同。)


    错误信息

    AttributeError, NoneType has no attribute generator
    

    建议当Python到达Class2.generator()时,Class2就是None,因此Python找不到它的generator属性。

    现在您可能想知道,Class2 怎么可能是 None?如果class_decorator 返回None 可能会发生这种情况,因为这会导致Class2 等于None

    Class2 = class_decorator(Class2)
    

    所以检查class_decorator是否返回一个类:

    def class_decorator(cls):
        # modify cls
        return cls      # The error could be due to this line being missing
    

    【讨论】:

    • 好电话,这很可能是问题的根源。但我认为这是工作代码???
    • 等等,Class2 怎么能在同样的错误装饰器中幸存下来并被实例化?提炼的代码没有显示真正发生的事情。
    • @alexis:你是对的——如果没有可运行的代码和完整的回溯错误消息,很难准确地说出哪里出了问题。
    • @unbuntu,谢谢,类装饰器缺少返回语句。这就是问题所在。
    【解决方案2】:

    这一定是装饰器做的事情。通常,装饰者应该妨碍这一点——除非它是故意的。我用一个简单的装饰器(以及my_list 的值)扩展了你的代码,它运行良好:

    def class_decorator(cls):
        return cls
    

    所以追踪class_decorator 看看它做了什么。

    【讨论】:

    • 谢谢,装饰器没有返回课程。所以,没有返回。
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2011-06-26
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多