假设我们有k
类型的对象class A
。我们定义了第二个class B(A)
。将对象k
“转换”为class B
并保留k
中的所有数据的最佳做法是什么?
答案 0 :(得分:17)
这是“阶级转换”,但它受到附带损害。创建另一个对象并将其__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
答案 1 :(得分:7)
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__)
答案 2 :(得分:0)
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
但是使用第二种方法,我无法弄清楚如何传递其他值