1

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

我有两节课,两节课都有装饰。它们位于单独的文件中。我想在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 上调用类方法吗?

4

2 回答 2

2

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

def class_decorator(cls):
    return cls

因此,追踪class_decorator并查看它的作用。

于 2013-11-06T12:00:00.287 回答
2
@class_decorator
class Class2(object):

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

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

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


错误信息

AttributeError, NoneType has no attribute generator

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

现在你可能想知道,怎么Class2可能None?如果class_decoratorreturn可能会发生这种情况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
于 2013-11-06T12:35:30.743 回答