我继承了一个项目。我对装饰师不太好,但我正在学习!
我有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吗?
答案 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()
时,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