Структура программы для базы данных вызываемых Python объектов - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над проектом, который требует большой базы данных python объектов, каждый из которых имеет ровно два метода: __init__ и __call__. init определяет атрибуты, указывающие c для каждого объекта, а метод call содержит определение функции, параметризованной атрибутами. Прямо сейчас я представляю эту базу данных с помощью большого .py файла, содержащего все объекты. Например, первые две записи в файле myfuncs.py выглядят примерно как

class Alice:
    def __init__(self, a=10, b=4):
        self.a = a
        self.b = b
        self.color = "red"

    def __call__(self, X):
        return X**2 + self.a + self.b

class Timmy:
    def __init__(self, h=1):
        self.a = a
        self.color = "blue"    

    def __call__(self, X):
        return X**4*self.h

Я мог бы использовать эти классы в отдельной программе:

from myfuncs import Alice
model = Alice(a=10)
y = model(15)
print("The value was ", str(y), " and the color is ", model.color)

Обратите внимание, что метод init для обоих объектов содержит жестко заданный атрибут color и значение, заданное c для этого объекта. Все объекты в базе данных имеют этот атрибут, и в настоящее время единственный способ связать этот атрибут с объектом - использовать жестко заданное значение в конструкторе.

Вместо того, чтобы иметь один длинный .py файл с кучей объектов (и много шаблонного кода), мне кажется, что должен быть какой-то способ определить базу данных объектов, каждый с атрибутом color и другим атрибутом function, который содержит содержимое __call__() аргументы метода и ключевого слова по умолчанию. Однако после импорта указанного объекта c мне нужно, чтобы он обрабатывался как нативная функция Python, поэтому я не уверен, что сохранение функций в виде строк с последующим использованием exec будет работать.

Хотя мой минимальный пример может показаться надуманным, в моем приложении эти объекты содержат в своих call методах сложную математическую формулу, записанную как Python функции, ключевое слово args - значения параметров в этих формулах, а свойство color - метка, связанная с каждой формулой, которая обозначает ее группу симметрии (это то, что я знаю о каждой функции из внешней информации).

Как лучше всего структурировать мой проект?

1 Ответ

1 голос
/ 17 июня 2020

Хорошо, вот немного лучший способ избавиться от большого количества шаблонов:

from abc import abstractmethod, ABC


class BaseModel(ABC):
    color: str

    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    @abstractmethod
    def __call__(self, x):
        ...


class Alice(BaseModel):
    color = 'red'
    b = 4

    def __call__(self, x):
        return x ** 2 + self.a + self.b


class Timmy(BaseModel):
    color = 'blue'
    h = 1

    def __call__(self, x):
        return x ** 4 * self.h

Таким образом вам нужно определить только те части, которые меняются от класса к классу.

Также вы можете express напечатать так:

print(f"The value was {y} and the color is {model.color}")
...