Python: передать всю себя класса для инициализации нового класса - PullRequest
0 голосов
/ 03 августа 2020

У меня есть класс и подкласс, я бы хотел передать всю сущность класса подклассу. Я могу достаточно легко передать себя в новый класс, например,

class foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.c = 'foo'
        
    def foo_method(self):
        print('a foo method')

class bar(foo):
    def __init__(self, foo_object):
        self.a = foo_object.a
        self.b = foo_object.b
        self.c = foo_object.c
    
    def bar_method(self):
        print('a bar method')

foo_object = foo(a = 'a', b = 'b')
bar_object = bar(foo_object)

bar_object.a

Есть ли более лаконичный способ передать это? Что-то вроде:

class bar(foo):
    def __init__(self, foo_object):
        self = self.foo_object

Обновление:

Спасибо { ссылка }, сработало следующее решение:


class bar(foo):

    def __init__(self, foo_object):
        self.__dict__ = foo_object.__dict__.copy()
    
    def bar_method(self):
        print('a bar method with ' + str(self.c))

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вы пробовали copy встроенную библиотеку?

В противном случае, я думаю, вы можете легко реализовать свой собственный .copy() метод, который будет копировать значения из старого объект __dict__ в новый . Примерно так:

class MyObject:

    a = None

    def set_default_values(self):
        self.a = 1

    def copy(self, old):
        if type(self) == type(old):
            self.__dict__ = old.__dict__.copy()
        else:
            raise TypeError('Wrong type')

if __name__ == "__main__":
    obj_1 = MyObject()
    print(obj_1.a)

    obj_1.set_default_values()
    print(obj_1.a)

    obj_2 = MyObject()
    print(obj_2.a)

    obj_2.copy(obj_1)
    print(obj_2.a)

Обратите внимание, что я добавил проверку типа, чтобы быть уверенным, что вы копируете атрибуты, которые существовали бы в противном случае, но я думаю, что просто self.__dict__ = old.__dict__.copy() будет работать нормально, думал, что вы можете закончить с атрибутами, которые вы, возможно, не предполагали иметь в объекте new .

Надеюсь, это поможет!

0 голосов
/ 03 августа 2020

Я думаю, вы можете сделать это с помощью

    class bar(foo):
        def __init__(self):
            super(bar, self).__init__()

с помощью этого кода, вы запустили функцию init для подкласса

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