2

我目前正在通过“Dive Into Python”来学习该语言,我对第 5 章的示例 5.10 有点困惑。UserDict 普通方法

例 5.10。UserDict 普通方法

def copy(self):
    if self.__class__ is UserDict:
        return UserDict(self.data)
    import copy
    return copy.copy(self)

data字典在哪里。

我注意到,如果该类是 UserDict 类型,那么它会返回UserDict(self.data). 我很困惑的是,为什么你需要 returnUserDict(self.data)而不是return self.data?self.data 不是可以返回的字典吗?

UserDict(self.data)如果有人可以解释 return和之间的区别self.data,我将不胜感激。

4

3 回答 3

2

它返回一个新UserDict对象,因为.copy()期望返回与其复制相同类型的对象。

于 2011-03-29T20:02:41.637 回答
1

为了产生副本,您应该使用UserDict(self.data).

为什么我们使用UserDict(self.data)self.data 而不是它返回与 self 相同的类的新实例。

如果你只返回self.data,那么你没有复制。因为它返回一个dict,而不是 的一个实例UserDict。如果要制作副本,则应使用UserDict(self.data).

于 2011-03-29T20:25:03.740 回答
0

您在这里看到的是优化。

您可以将UserDict其用作基类来编写自己的子类。如果您不覆盖copy()子类上的方法,那么您会从基类中获得一个,即您在此处查看的那个。

所以基本上,它正在检查它是否在子类中运行。如果不是,它知道复制自己的最快方法是使用自己的构造函数。但如果它在子类中运行,它不知道您可能添加了什么以及需要复制什么,因此它使用copy模块中更通用的复制功能。这不会那么快,但它更有可能复制需要复制的内容。(当然,copy()如果你是子类的话,你也许应该编写自己的方法UserDict......)

它不会返回self.data,因为它self.data是 a dict,而不是 a UserDict,而且它不是副本。

于 2011-03-29T20:19:06.253 回答