Each Answer to this Q is separated by one/two green lines.
Assume that we have an object
k of type
class A. We defined a second
class B(A). What is the best practice to “convert” object
class B and preserve all data in
This does the “class conversion” but it is subject to collateral damage. Creating another object and replacing its
__dict__ as BrainCore posted would be safer – but this code does what you asked, with no new object being created.
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
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
Would this satisfy your use case? Note: Only the instance variables of b will be accessible from object a, not class B’s class variables. Also, modifying variables in a will modify the variable in b, unless you do a deepcopy:
import copy a.__dict__ = copy.deepcopy(b.__dict__)
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 a_instance = A(1, 2) b_instance = B(a_instance, 7) print(b_instance.a + b_instance.b + b_instance.c) >> 10
Or you could have a sperate function for this:
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
But using the 2nd method, I wasn’t able to figure out how to pass additional values