Преобразование объекта Python - PullRequest
28 голосов
/ 28 января 2010

Предположим, что у нас есть объект k типа class A. Мы определили секунду class B(A). Как лучше всего преобразовывать объект k в class B и сохранять все данные в k?

Ответы [ 3 ]

17 голосов
/ 28 января 2010

Это делает "преобразование класса", но это подвергается дополнительному ущербу. Создание другого объекта и замена его __dict__ при публикации BrainCore будет более безопасным, но этот код выполняет то, что вы просили, без создания нового объекта.

class A(object):
    pass

class B(A):
    def __add__(self, other):
        return self.value + other


a = A()
a.value = 5

a.__class__ = B

print a + 10
7 голосов
/ 28 января 2010
a = A() # parent class
b = B() # subclass
b.value = 3 # random setting of values

a.__dict__ = b.__dict__ # give object a b's values

# now proceed to use object a

Удовлетворит ли это ваш вариант использования? Примечание: из объекта a будут доступны только переменные экземпляра b, а не переменные класса класса B. Кроме того, изменение переменных в a приведет к изменению переменной в b, если вы не выполните глубокую копию:

import copy
a.__dict__ = copy.deepcopy(b.__dict__)
0 голосов
/ 22 апреля 2019
class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

class B(A):
    def __init__(self, parent_instance, c):
        # initiate the parent class with all the arguments coming from
        # parent class __dict__
        super().__init__(*tuple(parent_instance.__dict__.values()))
        self.c = c
        seld.d = d

a_instance = A(1, 2)
b_instance = B(a_instance, 7)
print(b_instance.a + b_instance.b + b_instance.c)
>> 10

Или для этого может быть предусмотрена отдельная функция:

def class_converter(convert_to, parent_instance):
    return convert_to(*tuple(parent_instance.__dict__.values()))

class B(A):
    def __init__(self, *args):
        super().__init__(*args)
            self.c = 5

Но используя 2-й метод, я не смог понять, как передать дополнительные значения

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