继承中装饰器的范围问题

时间:2014-06-10 02:05:12

标签: python inheritance decorator

我试图检查一个类是否能够通过装饰器拥有一个文件,使用下面的代码我发现即使子类CSVStorageHandler调用其父类checkIfNoStorageHandler变量{{ 1}}超出范围。

这是相当令人困惑的,任何人都可以帮忙吗?

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()

2 个答案:

答案 0 :(得分:1)

self.func()是一种勇敢的尝试,但不起作用,因为点语法永远不会关心名为func的本地。

您希望确保该功能收到self,因此请将其传入。

return func(self, *args, **kwargs)

答案 1 :(得分:0)

func在范围内,但您的代码正在尝试访问self.func。也许你的意思是在第9行使用func()而不是self.func()