Python对象转换

时间:2010-01-28 08:59:13

标签: python

假设我们有k类型的对象class A。我们定义了第二个class B(A)。将对象k“转换”为class B并保留k中的所有数据的最佳做法是什么?

3 个答案:

答案 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

但是使用第二种方法,我无法弄清楚如何传递其他值