Как создать экземпляр подкласса из экземпляра суперкласса - PullRequest
0 голосов
/ 10 апреля 2019

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

class A():
    def __init__(self, type):
        ...
        self.type = type # this will be something that corresponds to either B or C

class B(A):
    def do_something():
        # this method is subclass specific

class C(A):
    def do_something():
        # this method is again subclass specific

У меня есть функция, которая получает экземпляр A, и мне нужно создать экземпляр B или C (или D ...) на основе того, что Aатрибут type есть.

Я не уверен, как это сделать.Есть ли выход из этого или решение нужно переработать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Начните с переопределения классов A, B и C следующим образом. Обратите внимание, что вам также нужно передать значение type из подкласса в конструктор суперкласса через super().__init__()

class A():
    def __init__(self, type):
        ...
        self.type = type # this will be something that corresponds to either B or C

class B:

    def __init__(self, type):
        super().__init__(type)

    def do_something(self):
        print('do_something called for B')

class C:

    def __init__(self, type):
        super().__init__(type)

    def do_something(self):
       print('do_something called for C')

Затем создайте другой класс, который может принять решение, вызывать ли вам B и C, и сохраните этот объект локально

class User:

    def __init__(self, type):
        self.obj = None
        if type == 'B':
            self.obj = B(type)
        elif type == 'C':
            self.obj = C(type)

Затем вы можете создать экземпляр класса пользователя с разными типами и увидеть, что вызывается правильный do_something.

user_B = User('B')
user_B.obj.do_something()
#do_something called for B
user_C = User('C')
user_C.obj.do_something()
#do_something called for C
0 голосов
/ 10 апреля 2019

Используйте словарь, который сопоставляет типы с классами.

class A():
    typemap = {}

    def __init__(self, typearg): # renamed this argument so it doesn't shadow standard type() function
        self.type = typearg
        self.typemap[typearg] = type(self)

    def create_child(self, *args):
        return typemap[self.type](*args)

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

create_child() ищет класс в словаре и вызывает его для создания нового экземпляра этого дочернего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...