在Python中返回数据

2 投票
3 回答
906 浏览
提问于 2025-04-16 14:40

我现在正在阅读《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)。我困惑的是,为什么要返回UserDict(self.data),而不是直接返回self.data呢?难道self.data不是一个字典吗?我们不是可以直接返回它吗?

如果有人能解释一下返回UserDict(self.data)self.data之间的区别,我会非常感激。

3 个回答

0

你看到的这个内容是在讲一个优化的做法。

你可以用 UserDict 作为基础类,来写你自己的子类。如果你没有在你的子类里重写 copy() 方法,那么你就会使用基础类里的那个方法,也就是你现在看到的这个。

简单来说,它在检查自己是不是在子类里运行。如果不是,它知道最快的复制自己方式就是用自己的构造函数。但如果是在子类里,它就不知道你可能添加了什么内容,也不知道哪些东西需要被复制,所以它会使用 copy 模块里更通用的复制方法。这个方法虽然不如前面那个快,但更有可能把需要复制的内容都复制过来。(当然,如果你是从 UserDict 继承的子类,可能应该自己写一个 copy() 方法……)

它不返回 self.data,因为 self.data 是一个 dict,而不是 UserDict,而且它也不是一个复制品。

2

它返回一个新的 UserDict 对象,因为 .copy() 方法的作用是返回一个和它复制的对象类型相同的新对象。

1

为了生成一个副本,你应该使用 UserDict(self.data)

我们使用 UserDict(self.data) 而不是 self.data 的原因是,它会返回一个新的实例,这个实例和 self 是同一个类。

如果你只返回 self.data,那你就没有真正复制。因为它返回的是一个 dict,而不是 UserDict 的实例。如果你想要生成一个副本,就应该使用 UserDict(self.data)

撰写回答