【问题标题】:Call method when object is copied复制对象时调用方法
【发布时间】:2019-04-18 08:29:51
【问题描述】:

我有以下课程:

class MyClass:

    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

    def normalize(self):
        self.value1 = 1
        return self

normalize 方法的目标是确保每当复制 MyClass 的“旧”实例时,属性 value1 被设置回 1

例如:

myclassA = MyClass(15,25)
myclassB = myclassA.normalize()
print(myclassB.value1)
print(myclassB.value2)
>>1
>>25

这行得通。但是,有没有一种方法可以在没有单独方法的情况下达到相同的结果(在我的情况下为normalize())?每当一个实例被创建为MyClass 类的另一个实例的副本时,我是否可以自动实现这一点?

【问题讨论】:

  • 为什么要复制现有的实例?为什么不做一个新的?
  • 你实际上并没有在这里“复制”,你知道的,对吧?
  • 您实际上没有制作任何副本。 myclassAmyclassB 都引用同一个对象,如果您检查 myclassA.value1,您将看到 1 的值。 Python 不像 C++,隐式复制无处不在。特别是,赋值、参数传递和返回值都无需复制即可操作。见nedbatchelder.com/text/names.html
  • 如何创建副本?你的意思是copy.copy? Python 没有“复制构造”的概念。

标签: python python-3.x class oop


【解决方案1】:

最好使用__copy__

class MyClass:

    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2

    def __copy__(self):
        return self.__class__(1, self.value2) 

然后:

In [5]: from copy import copy                                                                                                                                                                  

In [6]: myclassA = MyClass(15,25) 

In [7]: myclassB = copy(myclassA)   

In [15]: myclassA.value1                                                                              
Out[15]: 15

In [16]: myclassB.value1                                                                                        
Out[16]: 1

In [17]: myclassA.value2                                                                                        
Out[17]: 25

In [18]: myclassB.value2                                                                                        
Out[18]: 25

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多