【发布时间】:2014-07-30 16:06:44
【问题描述】:
我正在尝试检查一个类是否能够通过装饰器拥有一个文件,使用下面的代码我发现即使子类CSVStorageHandler 调用其父类的checkIfNoStorageHandler,变量func 已超出范围。
这有点令人困惑,有人可以帮忙吗?
class StorageHandler(object):
def __init__(self):
self.output_file = self.openFile()
def checkIfNoStorageHandler(func):
def createFileByStorageHandler(self, *args, **kwargs):
print func
if self.__class__.__name__ == "CSVStorageHandler":
return self.func()
else:
print ("class " + self.__class__.__name__ + " don't store file by default")
return None
return createFileByStorageHandler
@checkIfNoStorageHandler
def openFile(self):
return open('./log.txt', 'w')
class CSVStorageHandler(StorageHandler):
def doNothing(self):
pass
class NoStorageHandler(StorageHandler):
def doNothing(self):
pass
test = CSVStorageHandler()
错误信息
Traceback (most recent call last):
File "tset_decorator_inheritance.py", line 27, in <module>
test = CSVStorageHandler()
File "tset_decorator_inheritance.py", line 3, in __init__
self.output_file = self.openFile()
File "tset_decorator_inheritance.py", line 9, in createFileByStorageHandler
return self.func()
AttributeError: 'CSVStorageHandler' object has no attribute 'func'
【问题讨论】:
-
我看不到您将
func属性分配给StorageHandler或其任何子项的任何地方。因此,该错误消息完全有意义。它与范围界定无关。你是不是只想做return func()而不是return self.func()? -
感谢您的建议,但
func()是openFile(self),我需要self.func()才能正确调用 -
见下面@Eevee 的回答。
标签: python inheritance decorator