Использовать экземпляр существующего класса, такой же, как родительский, дочерним классом.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использовать экземпляр существующего класса, такой же, как родительский, дочерним классом.

Сообщение Anonymous »

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

Если вы имеете в виду (как предложил @Barmar), что вам нужен способ скопировать все атрибуты экземпляра Foo к экземпляру Bar, это другая история. В этом случае вам все равно нужно внимательно определить, что именно вы подразумеваете под «всеми атрибутами».

Под «всеми атрибутами» я имею в виду просто скопируйте поверх моих определенных. Точно так же, как pydantic видит и захватывает их для контекста ввода. Причем автоматически, потому что у большинства классов не просто 10-20 атр, а 50-200. И задавать каждый по одному в init вручную, чтобы скопировать его значение, было бы излишним, поскольку они уже однажды записаны в соответствующем классе.
Проблема проектирования заключается в том, что политика должна сделать первый запрос к базе данных, чтобы получить идентификатор Case_id записи, на которую она ссылается, чтобы с помощью этих собранных знаний она знала, как загрузить детали этой политики из базы данных.

Это потому, что я загружаю файл Python ({case_id}.py), в котором я храню конкретную информацию о том, какое имя таблицы нужно искать и какие поля там есть. Таким образом, он полностью разделен.
main.py

Код: Выделить всё

from Models.Policy import Policy
from Models.PolicyDetails import PolicyDetails
policy = Policy()
policy.findById(policy_id)
details = PolicyDetails()
details.loadFrom( policy )
Policy.py

Код: Выделить всё

from pydantic import BaseModel
from .ActiveRecord import ActiveRecord

class Policy(BaseModel, ActiveRecord):
id: int = None
case_id: str = None
v_number: str = None
g_id: str = None

def __init__(self):
BaseModel.__init__(self)
ActiveRecord.__init__(Policy)

def tableName(self):
return 'gn_policy'

def idName(self):
return 'identifier'

def getTableColumnMap(self):
return {
"identifier": "id",
"case_description": "case_id",
"pol_doc_number": "v_number",
"grow_val_identifier": "g_id"
}
PolicyDetails.py

В этом классе я динамически загружаю файлы {case_id}.py, создаю их экземпляры и хочу использовать дочерний элемент .

Код: Выделить всё

import importlib
from pydantic import BaseModel
from .Policy import Policy

class PolicyDetails(BaseModel):

details: object = None

def __init__(self):
pass

def loadFrom(self, policy: Policy):
case_id = policy.case_id
case_class = self.load_class(case_id)
case_instance = case_class(policy)

def load_class(self, id: str):
case_module = importlib.import_module("."+id, "Models")
case_class = getattr(case_module, id)
return case_class
Два файла {case_id}.py выглядят следующим образом:

GERM.py

Код: Выделить всё

class GERM(Policy):
def tableName():
return 'gn_GERM'

address: str = None
def getTableColumnMap(self):
return {
"adr": "address"
}
IMP.py

Код: Выделить всё

class IMP(Policy):
def tableName():
return 'gn_IMP'

firstname: str = None
lastname: str = None
def getTableColumnMap(self):
return {
"FI": "firstname",
"LA": "lastname"
}
Основная цель — заполнить/гидратировать экземпляр политики с помощью отложенно собранных сведений о нем.
Предназначено ли наследование для решения этой проблемы или, более того, уже сделано по составу?
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/789 ... hild-class
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»