2008-11-18 52 views
1

我有一个基于保险丝文档中Xmp示例的python保险丝项目。我已经包含了一小段代码来展示它的工作原理。出于某种原因,get_file并没有被调用,并且该类被创建,但是get_file(file_class)保险丝不是调用fuse的read()函数,而是调用Dstorage.read(),这违背了读取函数的目的类。为什么保险丝不使用file_class中提供的类

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共同 https://code.launchpad.net/~asa-ayers/+junk/dstorage
的bzr分支LP:〜ASA-艾尔斯/ dstorage /后备箱

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

回答

1

综观保险丝类的代码(其是曲折的小通道生成方法代理的迷宫),我看到这个位(这是用于创建内Fuse.MethodProxy._add_class_type一个setter闭合,线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,这是一个绑定的方法。代理属性的循环期望能够从您设置的类中获取属性,并在包装​​它们之后将它们放入其代理字典中,但它们不在那里,因为它是绑定方法而不是类。由于找不到它们,它将恢复为在Dstorage上调用它们。因此,长话短说,你不能使用可返回一个实例(一种伪类)而不是一个类的callable,因为Fuse正在反思你设置的对象以找到它应该的方法呼叫。

您需要为file_class指定一个类 - 如果您需要返回父级实例,则可以使用它们在文档中显示的嵌套类技巧。