Создайте библиотеку функций, в которой каждая функция имеет инкапсулированные данные, к которым можно получить доступ как внутри, так и извне функции. - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу сделать библиотеку функций. И я хочу, чтобы каждая функция содержала «stati c information», которая указывает c на эту функцию (это self.meta_data в модели ниже). И я хочу, чтобы функция могла ссылаться на эту информацию c. Очевидно, я мог бы создать класс, содержащий функции, которые имеют локальные переменные, которые содержат информацию о состоянии c. Тем не менее, я хочу иметь возможность собирать эту статистическую информацию время от времени; другими словами, информация о состоянии c должна быть доступна извне функции.

Модель, приведенная ниже, выполняет эти требования, создавая класс для каждой функции . Класс содержит "информацию о состоянии c", на которую может ссылаться функция, и эта информация о состоянии c может быть программно агрегирована при необходимости; она доступна извне функции.

В этой модели каждый класс внутри библиотеки предназначен для класса одного экземпляра .

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

  • Я не хочу использовать словарь, потому что мне нужно уметь чтобы получить доступ к функции и к "информации о состоянии c", используя точечную запись.
  • Я не хочу использовать __call__, поскольку она слишком специфична c для Python.

    class Variable():
    
        def __init__(self, library, wrapper):
    
            self.library=library
    
            self.wrapper=wrapper
    
    class Source():
    
        def __init__(self):
            pass
    
    class Wrapper():
    
        def __init__(self, source):
    
            self.source=source
    
            self.library=self.Library(self)
    
        class Library():
    
            def __init__(self, wrapper):
    
                for variable in dir(self):
                    clss = getattr(self, variable)
                    try: 
                        if issubclass(clss, Variable):
                            setattr(self, variable, clss(self, wrapper))
                    except:
                        pass
    
            class variable_name(Variable):
    
                def __init__(self, library, wrapper):
                    super().__init__(library, wrapper)
    
                    self.meta_data="Meta-data specific to this fn." 
    
                def fn(self):
    
                    print(self.wrapper)
                    print(self.library)
                    print(self.meta_data)
    
    source = Source()
    wrapper = Wrapper(source)
    wrapper.library.variable_name.meta_data # Meta-data specific to this fn.
    wrapper.library.variable_name.fn() # Wrapper, Library, Meta-data specific to this fn.
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...