Python对象转换
假设我们有一个类型为 class A
的对象 k
。我们定义了一个第二个类 class B(A)
,也就是 B
是从 A
继承来的。那么,怎样才能把对象 k
转换成 class B
类型,同时又能保留 k
中的所有数据呢?
3 个回答
2
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
或者你可以为这个创建一个单独的函数:
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
但是使用第二种方法时,我没能弄明白怎么传递额外的值。
8
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
import copy
a.__dict__ = copy.deepcopy(b.__dict__)
这样做能满足你的需求吗?注意:从对象a中只能访问到b的实例变量,而不能访问到B类的类变量。另外,如果你在a中修改了变量,b中的变量也会被修改,除非你使用深拷贝(deepcopy)来创建一个新的副本。
20
这段代码实现了“类转换”,但可能会有一些意外的问题。像BrainCore提到的那样,创建一个新的对象并替换它的__dict__
会更安全一些。不过,这段代码确实完成了你要求的功能,而且没有创建新的对象。
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