2008-11-18 51 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指定一個類 - 如果您需要返回父級實例,則可以使用它們在文檔中顯示的嵌套類技巧。