Почему предохранитель не использует класс, указанный в file_class

StackOverflow https://stackoverflow.com/questions/300047

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть проект предохранителя Python, основанный на примере Xmp в документации плавкого предохранителя.Я включил небольшой фрагмент кода, чтобы показать, как это работает.По какой-то причине get_file вызывается и класс создается, но вместо вызова функции .read() для класса из 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)

Мой код размещен на панели запуска, вы можете скачать его с помощью этой команды.
БЗР Ко https://code.launchpad.net/~asa-ayers/+junk/dstorage
ветка bzr lp:~asa-ayers/dstorage/trunk

решение:
Я использовал прокси-класс, который является подклассом того, который мне нужен, и в конструкторе я получаю экземпляр нужного мне класса и перезаписываю все методы прокси, чтобы просто вызывать методы экземпляра.

Это было полезно?

Решение

Глядя на код класса Fuse (который представляет собой лабиринт извилистых маленьких проходов, создающих прокси-методы), я вижу этот бит (который представляет собой замыкание, используемое для создания сеттера внутри 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, который является связанным методом.Ожидается, что цикл по прокси-атрибутам сможет получить атрибуты из установленного вами класса и поместить их в свой класс. mdic прокси-словарь после их упаковки, но их там нет, потому что это связанный метод, а не класс.Поскольку он не может их найти, он возвращается к их вызову. Dstorage.

Короче говоря, вы не можете использовать здесь вызываемый объект, который возвращает экземпляр (своего рода псевдокласс) вместо класса, потому что Fuse исследует установленный вами объект, чтобы найти методы, которые он должен вызывать.

Вам нужно назначить класс file_class - если вам нужно вернуться к родительскому экземпляру, вы можете использовать трюк с вложенным классом, который показан в документации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top