访问装饰类

时间:2013-11-06 11:52:30

标签: python class decorator

我继承了一个项目。我对装饰师不太好,但我正在学习!

我有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上调用classmethod吗?

2 个答案:

答案 0 :(得分:2)

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

def class_decorator(cls):
    return cls

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

答案 1 :(得分: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()时,Class2None,因此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