在Python中返回数据
我现在正在阅读《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 个回答
你看到的这个内容是在讲一个优化的做法。
你可以用 UserDict
作为基础类,来写你自己的子类。如果你没有在你的子类里重写 copy()
方法,那么你就会使用基础类里的那个方法,也就是你现在看到的这个。
简单来说,它在检查自己是不是在子类里运行。如果不是,它知道最快的复制自己方式就是用自己的构造函数。但如果是在子类里,它就不知道你可能添加了什么内容,也不知道哪些东西需要被复制,所以它会使用 copy
模块里更通用的复制方法。这个方法虽然不如前面那个快,但更有可能把需要复制的内容都复制过来。(当然,如果你是从 UserDict
继承的子类,可能应该自己写一个 copy()
方法……)
它不返回 self.data
,因为 self.data
是一个 dict
,而不是 UserDict
,而且它也不是一个复制品。
它返回一个新的 UserDict
对象,因为 .copy()
方法的作用是返回一个和它复制的对象类型相同的新对象。
为了生成一个副本,你应该使用 UserDict(self.data)
。
我们使用 UserDict(self.data)
而不是 self.data 的原因是,它会返回一个新的实例,这个实例和 self 是同一个类。
如果你只返回 self.data
,那你就没有真正复制。因为它返回的是一个 dict
,而不是 UserDict
的实例。如果你想要生成一个副本,就应该使用 UserDict(self.data)
。