【问题标题】:Python changing ClassA instance variables in ClassBPython更改B类中的类实例变量
【发布时间】:2015-05-14 08:17:55
【问题描述】:

我正在尝试通过 dill 加载整个类实例,而不是一次转储并加载每个类变量。

谁能告诉我怎么做:

class Object(object):
    pass

class ClassA:
    def __init__(self):
        self.DATA = "Initial"

class ClassB:
    def __init__(self, CA):
        self.CA = CA

    def updateValue(self):
        #a = dill.load(ClassA.storage)
        a = Object()
        a.DATA = "new value"
        self.CA = a
        print self.CA.DATA

CA = ClassA()
CB = ClassB(CA)
CB.updateValue()
print CA.DATA

所以输出是:

new value
new value

【问题讨论】:

    标签: python class object dill


    【解决方案1】:

    我想你在问:

    给定对象 A 和对象 B,如何一步(或以编程方式)将 A 的所有属性复制到 B?

    天真的方法:

    B.__dict__ = dict(A.__dict__) # make a copy so objects don't share same dict
    

    这种方法的问题在于,它破坏了 B 中任何在 A 中不存在的预先存在的属性。例如。

    B.attr = "some value"
    B.__dict__ = dict(A.__dict__)
    print(hasattr(B, "attr")) # expect False
    

    更好的方法。这种方法会复制 A 的属性,并保留 B 上存在的所有属性,而不是 A 上的任何属性。

    B.__dict__.update(A.__dict__)
    

    但是,如果您要复制 A 的类及其父类的属性,仍然存在问题。但我认为这是一个不同的问题。

    【讨论】:

    • 谢谢,正是我想要的。
    • 我是莳萝作者。我认为您不需要为此进行序列化,除非您希望跨会话保留对象。 @Dunes 显示了更合适的路线。
    【解决方案2】:

    在你的updateValue

    def updateValue(self):
        self.ca.DATA = "new value"
    

    【讨论】:

    • 谢谢,但问题是可以不指定'DATA'就完成
    • 您的用例是什么?我的意思是,你想达到什么目的?从问题来看,您似乎想更改班级成员。我弄错了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2012-01-31
    • 1970-01-01
    • 2019-05-07
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多