1

ヒューズのドキュメントにあるXmpの例に基づいたPythonヒューズプロジェクトがあります。これがどのように機能するかを示すために、コードの一部を含めました。何らかの理由でget_fileが呼び出され、クラスが作成されますが、fuseがget_file(file_class)からクラスで.read()を呼び出す代わりに、fuseは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 branch lp:〜asa-ayers / dstorage / trunk

解決策:
必要なものをサブクラス化するプロキシクラスを使用し、コンストラクターで必要なクラスのインスタンスを取得し、プロキシのすべてのメソッドを上書きして、インスタンスメソッドを呼び出すだけです。

4

1 に答える 1

1

Fuse クラスのコード (メソッド プロキシを作成する曲がりくねった小さな通路の迷路) を見ると、次のビットが表示されます ( Fuse.MethodProxy._add_class_type865 行目にセッターを作成するために使用されるクロージャー):

        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

要するに、ここではクラスの代わりにインスタンス (疑似クラスのようなもの) を返す callable を使用することはできません。これは、Fuse が呼び出すメソッドを見つけるために設定したオブジェクトをイントロスペクトしているためです。

クラスを割り当てる必要がありfile_classます-親インスタンスを参照する必要がある場合は、ドキュメントに示されているネストされたクラスのトリックを使用できます。

于 2008-11-19T10:10:28.433 に答える