Я пытаюсь создать оболочку, которая может принимать имя класса (не объекта) и вставлять словарь в каждый экземпляр класса.Ниже приведен фрагмент того, как я этого достигаю, когда оборачиваю существующую функцию.
def insert_fn_into_class(cls):
"""Decorator function that consumes a function and inserts it into the cls class."""
def decorator(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
return func(*args, **kwargs)
setattr(cls, f'prefix_{func.__name__}', wrapper)
return decorator
Как я могу использовать подобный шаблон для оформления словаря и вставки его в класс cls.Поскольку словари не могут быть вызваны, как будет создаваться такая оболочка?
Обновление
Спасибо за конструктивный отзыв по этому вопросу.Один из пользователей переполнения стека справедливо указал, что мне не удалось объяснить, ПОЧЕМУ я бы хотел это сделатьИтак, вот так:
- Я пытаюсь создать среду, которая может по существу потреблять набор пользовательских функций и расширять существующий класс.Итак, у меня есть класс
A
и пользовательские функции f_1
, f_2
, ..., f_n
, которые я хочу внедрить в класс A
, чтобы экземпляр этого класса obj_a = A()
могвызвать эти функции, такие как obj_a.f_1()
.Мне удалось добиться этого с помощью функции декоратора, аналогичной приведенному выше фрагменту кода. - Теперь у каждой пользовательской функции есть некоторый повторяющийся код, который, я думаю, можно устранить, если все экземпляры моего базового класса
A
может иметь доступ к пользовательскому словарю.Мой мыслительный процесс для достижения этой цели состоял в том, чтобы попытаться изменить мою существующую функцию-обертку, чтобы добавить ее в класс.Тем не менее, я знаю, что словари не могут быть вызваны, и, следовательно, вопрос.
Я надеюсь, что это было достаточно сложным.
Обновление 2
Похоже, что былопростор для более подробной разработки.Вот пример того, как выглядят различные компоненты, которые я описал ранее.
module_a.py
class BaseClass():
def __init__(self):
...
def base_class_method(self):
...
def run(self):
getattr(self, 'prefix_user_fn_1')()
def extend(cls=BaseClass):
def decorator(func):
def wrapper(self, *args, **kwargs):
return func(*args, **kwargs)
setattr(cls, f'prefix_{func.__name__}', wrapper)
return decorator
user_defined_functions.py
from module_a import BaseClass, extend
@extend()
def user_fn_1():
dict_ = {'a':'b', 'c':'d'}
...
@extend()
def user_fn_2():
dict_ = {'my':'dict', 'c':'d'}
...
main.py
from module_a import BaseClass
b = BaseClass()
b.run()
Каждая пользовательская функция содержит подмножество часто используемого словаря.Чтобы воспользоваться этим, я думаю, было бы удобно, если бы к нему можно было получить доступ как к части атрибутов BaseClass, вводимых динамически.
modified_user_defined_functions.py
# THIS WILL NOT WORK FOR OBVIOUS REASONS
from module_a import BaseClass, extend, common_config, insert_config_into_class
# @common_config ?? Is this even a good idea?
dict_ = {'my':'dict', 'a':'b', 'c':'d'}
insert_config_into_class(BaseClass, dict_)
@extend()
def user_fn_1(self):
print(self.dict_)
# do something with self.dict_
...
Чтобы включить это, я мог бы иметьчтобы изменить метод запуска на BaseClass
, чтобы он выглядел следующим образом:
modified_module_a.py
...
class BaseClass():
...
def run(self):
getattr(self, 'prefix_user_fn_1')(self)
Обновление 3 - Потенциальное решение
def shared_config(data, cls=BaseClass):
setattr(cls, 'SHARED_DICT', data)
Это решение работает,но также несколько отвечает на мой вопрос, на который, я думаю, я могу сказать, что, возможно, я переусердствовал в своем решении, написав декоратор для этого, когда простая функция могла бы достичь этого.
Однако, аспект исходного вопроса все ещеостается - это хороший подход?