2011-03-29 64 views
2

我目前正在通過「潛入Python」來查看語言,而我對第5章的例子5.10有點困惑。 UserDict正常方法在python中返回數據

例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之間的差異,我將非常感激。

+0

謝謝大家,感謝您的幫助。對此,我真的非常感激。 – foboi1122 2011-03-29 20:46:38

回答

1

爲了生成副本,您應該使用UserDict(self.data)

爲什麼我們使用UserDict(self.data)而不是self.data是它返回與自己相同的類的新實例。

如果你只返回self.data那麼你沒有複製。因爲它返回dict,而不是UserDict的實例。如果您想製作副本,則應使用UserDict(self.data)

2

它返回一個新的UserDict對象,因爲.copy()預計會返回與其複製相同類型的對象。

0

你在這裏看到的是一個優化。

您可以使用UserDict作爲基類來編寫自己的子類。如果您不覆蓋子類上的copy()方法,那麼您將從基類中獲得一個,即您在這裏查看的那個。

所以基本上,它檢查它是否運行在一個子類中。如果不是這樣,它就知道最簡單的方法是使用自己的構造函數。但是如果它運行在一個子類中,它不知道你可能添加了什麼以及需要複製什麼,所以它使用copy模塊中更通用的複製功能。這不會那麼快,但它更可能複製需要複製的內容。 (當然,你也許應該寫自己的copy()方法,如果您繼承UserDict ...)

不退還self.data因爲self.datadict,不是UserDict,並且它不是一個副本。