代码之家  ›  专栏  ›  技术社区  ›  Asa Ayers

为什么fuse不使用file_类中提供的类?

  •  1
  • Asa Ayers  · 技术社区  · 16 年前

    我有一个基于fuse文档中XMP示例的python fuse项目。我已经包含了一小段代码来演示这是如何工作的。出于某种原因,get_file确实会被调用并创建类,但fuse不会从get_file(file_class)中调用类的fuse calling.read(),而是继续调用dstorage.read(),这会破坏将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)
    

    我的代码托管在launchpad上,您可以用这个命令下载它。
    BZR公司 https://code.launchpad.net/~asa-ayers/+junk/dstorage
    BZR分支LP:~ASA Ayers/D存储/中继

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

    1 回复  |  直到 16 年前
        1
  •  1
  •   babbageclunk    16 年前

    看看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 代理字典在包装它们之后,但它们不在那里,因为它是一个绑定方法,而不是类。因为它找不到它们,所以它会恢复为呼叫它们。 Dstorage .

    因此,长话短说,在这里不能使用返回实例(类似于伪类)而不是类的可调用文件,因为fuse正在内省您设置的对象,以查找它应该调用的方法。

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