【问题标题】:how to assign self to another instance of itself如何将自己分配给自身的另一个实例
【发布时间】:2015-04-12 13:52:13
【问题描述】:

假设我有一堂课:

import copy
class TestClass:
    def __init__(self, value):
        if isinstance(value, TestClass):
            self = value.deepcopy()
        else:
            self.data = value

    def deepcopy(self):
        return copy.deepcopy(self)

我想写这样的代码,如果一个类的一个实例被同一个类的另一个实例初始化,它将生成第二个类的deepcopy

现在,如果我尝试

In []: x = TestClass(3)
In []: x.data
Out[]: 3

但如果我尝试

 In []: y = TestClass(x)
 Out[]: y.data
 ...
 AttributeError: 'TestClass' object has no attribute 'data'

当实例x 被传递给y 时,为什么deepcopy 没有发生?

【问题讨论】:

  • 所以,本质上,我不能只将 self 分配给另一个实例,而是需要将另一个实例的每个属性复制到当前实例?
  • 或者你可以创建一个不是构造函数但返回一个TestClass对象的函数。
  • 当您执行self = ... 时,您不会用复制的对象替换当前对象,而是让变量self 引用复制的对象。
  • 在 Python 中,您通常会说 y = x.copy() 而不是 y = TestClass(x)

标签: python python-3.x


【解决方案1】:

解决方案:

import copy
class TestClass:
    def __init__(self, value):
        if isinstance(value, TestClass):
            self.__dict__ = copy.deepcopy(value.__dict__)
        else:
            self.data = value

这使您的示例有效。你想做一个“复制构造函数”, 在 Python 对象中有一个 __dict__ 属性包含所有 成员,因此您可以从原始对象中复制字典 并将其分配给新对象__dict__

【讨论】:

  • 虽然这是一个副本,但它没有引用原始对象。
  • @JamieMarshall 如果要引用原始对象,我会说proxy 更好,即。一个可以透明地转移到原始对象的对象。加上一些成员,也许吧。
猜你喜欢
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多