Python对象转换

32 投票
3 回答
31290 浏览
提问于 2025-04-15 18:35

假设我们有一个类型为 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

撰写回答