1

我有一个基于 fuse 文档中的 Xmp 示例的 python fuse 项目。我已经包含了一小段代码来展示它是如何工作的。出于某种原因,get_file 确实被调用并创建了类,但不是从 get_file (file_class) 熔丝调用 .read() 类,而是继续调用 Dstorage.read() ,这违背了将读取函数移出的目的班级。

class Dstorage(Fuse, Distributor):
    def get_file(self, server, path, flags, *mode):
        pass
        # This does some work and passes back an instance of
        # a class very similar to XmpFile

    def main(self, *a, **kw):
        self.file_class = self.get_file
        return Fuse.main(self, *a, **kw)

我的代码托管在启动板上,您可以使用此命令下载它。
bzr co https://code.launchpad.net/~asa-ayers/+junk/dstorage
bzr 分支 lp:~asa-ayers/dstorage/trunk

解决方案:
我使用了一个代理类,它继承了我需要的类,在构造函数中我得到了我需要的类的实例并覆盖了所有代理的方法以简单地调用实例方法。

4

1 回答 1

1

查看 Fuse 类的代码(这是一个创建方法代理的曲折小段落的迷宫),我看到了这一点(这是一个用于在内部创建 setter 的闭包Fuse.MethodProxy._add_class_type,第 865 行):

        def setter(self, xcls):

            setattr(self, type + '_class', xcls)

            for m in inits:
                self.mdic[m] = xcls

            for m in proxied:
                if hasattr(xcls, m):
                    self.mdic[m] = self.proxyclass(m)

当你这样做时self.file_class = self.get_file,它会被调用self.get_file,这是一个绑定方法。代理属性的循环期望能够从您设置的类中获取属性,mdic在包装它们后将它们放入其代理字典中,但它们不存在,因为它是一个绑定方法,而不是一个类。由于找不到它们,它会恢复为调用它们 on Dstorage

所以,长话短说,你不能在这里使用返回实例(一种伪类)而不是类的可调用对象,因为 Fuse 正在内省你设置的对象以找到它应该调用的方法。

您需要分配一个类file_class- 如果您需要引用父实例,您可以使用它们在文档中显示的嵌套类技巧。

于 2008-11-19T10:10:28.433 回答