문제

퓨즈 문서의 XMP 예제를 기반으로 한 Python Fuse 프로젝트가 있습니다. 나는 이것이 어떻게 작동하는지 보여주는 작은 코드를 포함시켰다. 어떤 이유로 get_file이 호출되고 클래스가 생성되지만 get_file (file_class)의 클래스에서 퓨즈 호출 () 대신 get_file (file_class) 퓨즈는 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)

LaunchPad에서 내 코드를 호스팅했습니다.이 명령으로 다운로드 할 수 있습니다.
BZR 공동 https://code.launchpad.net/~asa-ayers/+ junk/dstorage
BZR Branch LP : ~ ASA-AYERS/DSTORAGE/TRUNK

해결책:
나는 내가 필요로하는 프록시 클래스를 사용했으며 생성자에서 필요한 클래스의 인스턴스를 얻고 인스턴스 메소드를 단순히 호출하기 위해 프록시의 모든 방법을 덮어 씁니다.

도움이 되었습니까?

해결책

퓨즈 클래스의 코드를 살펴보면 (이는 꼬인 작은 구절의 미로, 방법 프록시를 생성)이 비트를 본다 (이것은 내부에 세터를 만드는 데 사용되는 클로저입니다. 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, 이것은 바운드 방법입니다. Proxied 속성에 대한 루프는 설정 한 클래스에서 속성을 가져 와서 그것들을 그것에 넣을 수있을 것으로 기대합니다. mdic 프록시 사전을 감은 후 사전이지만, 클래스가 아닌 바운드 방법이기 때문에 거기에 있지 않습니다. 찾을 수 없으므로 전화로 돌아갑니다. Dstorage.

따라서 긴 이야기를 짧게, 퓨즈가 호출해야 할 메소드를 찾도록 설정 한 객체를 내성적으로 지정하기 때문에 여기에서 클래스 대신 인스턴스 (의사 클래스의 종류)를 반환하는 호출 가능을 사용할 수 없습니다.

클래스를 할당해야합니다 file_class - 부모 인스턴스를 다시 참조 해야하는 경우 문서에 표시된 중첩 클래스 트릭을 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top