Frage

Ich habe ein Python-Sicherung Projekt basierte auf dem Xmp Beispiel in der Sicherungs Dokumentation. Ich habe ein kleines Stück des Codes enthalten zu zeigen, wie das funktioniert. Aus irgendeinem Grund get_file nicht aufgerufen und die Klasse wird erstellt, sondern der Sicherung ruft .lesen () auf die Klasse von get_file (file_class) Sicherung hält Dstorage.read () aufrufen, die den Zweck besiegt beim Bewegen der Lesefunktion aus, dass Klasse.

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)

Ich habe meinen Code auf Launchpad gehostet, können Sie es mit diesem Befehl herunterladen.
bzr co https://code.launchpad.net/~asa- ayers / + Junk / dstorage
bzr branch lp: ~ asa-ayers / dstorage / trunk

Lösung:
Ich benutzte einen Proxy-Klasse, die die eine Unterklassen I benötigt und im Konstruktor erhalte ich die Instanz der Klasse I müssen und alle Proxy-Methoden überschreiben, einfach die Instanz-Methoden aufrufen.

War es hilfreich?

Lösung

auf dem Code der Fuse-Klasse suchen (das ist ein Labyrinth von kurvigen kleinen Passagen ist die Schaffung Methode Proxies), sehe ich dieses Bit (das ist ein Verschluss einen Setter innerhalb Fuse.MethodProxy._add_class_type, Linie 865 verwendet wird, ist zu erstellen):

        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)

Wenn Sie self.file_class = self.get_file tun, wird diese mit self.get_file genannt, die eine gebundene Methode ist. Die Schleife über Proxy-Attribute erwartet der Lage sein, die Attribute aus der Klasse bekommen Sie setzen, um sie in seine mdic Proxy-Wörterbuch zu setzen, nachdem sie Einwickeln, aber sie sind es nicht, weil es sich um eine gebundene Methode ist, sondern als eine Klasse. Da es sie nicht finden kann, kehrt er sich auf Dstorage zu nennen.

So lange Geschichte kurz, können Sie nicht eine aufrufbare verwenden, die eine Instanz zurückgibt (Art einer Pseudo-Klasse) statt eine Klasse hier, weil Fuse das Objekt ist introspecting, die Sie festlegen, die Methoden zu finden, sie nennen sollten .

Sie müssen eine Klasse zuweisen file_class - wenn Sie zurück in die übergeordnete Instanz verweisen müssen, können Sie die verschachtelte Klasse Trick verwenden können sie in der Dokumentation zeigen

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top