Re: [問題] python 自己跑出來的class method的問題

看板Python作者 (←這人是超級笨蛋)時間13年前 (2012/04/08 13:53), 編輯推噓1(107)
留言8則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《fuminfumin (fumin)》之銘言: : 我目前在學習web.py,主要的問題是看到裡面的一段程式碼好像black magic : 有問題的程式碼在下面 : https://github.com/webpy/webpy/blob/master/web/session.py : 在第107行的地方,class Session 的 _load() method 裡面 : 出現了 self.update(d) 這個程式碼。 : 我的疑問是 class Session 從來都沒有定義過 update() 這個 method, : 為什麼可以呼叫這個沒有被定義的 method。 : 我原本是猜想可能是前面一段 "class Session(object)" 繼承了 object 這個 class 了 : 但是我 google 都沒有找到 object 這個 class 有 update() 這個 method。 : 因此想請教一下這個 self.update() 到底是怎麼來的,謝謝。 先直接回答問題:來自於第 60 行附近的幾個函數 self.__getitem__ = self._data.__getitem__ self.__setitem__ = self._data.__setitem__ self.__delitem__ = self._data.__delitem__ update(self, dict2) 是 dict 的 method, 其運作是經由一些內部的保留函數達成 只要定義這些保留函數, 就可以把一個 Python object 變得 iterable 而可以使用一些 iterable object 才能使用的語法, update 是其中之一 在這個例子裡, self._data_ 是一個 dict 物件 這三行把 self._data_ 的三個 method 直接映射到 self 所以 self.update(value) 就等同於 self._data_.update(value) -- ╱ ̄ ̄ ̄╲ ▏◢█◣ 成龍表示: 是喔... ′/ ‵ ╰╯ ψQSWEET █◤ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.81.146

04/08 13:53, , 1F
04/08 13:53, 1F

04/08 19:51, , 2F
讚! 不過在下有另個想法想請教一下 因為以這種方式要使
04/08 19:51, 2F

04/08 19:52, , 3F
class變為iterable 必須要繼承object 感覺起來很像object
04/08 19:52, 3F

04/08 19:54, , 4F
個class裡面本來就有定個update(), update()被呼叫時先看看
04/08 19:54, 4F

04/08 19:55, , 5F
self.__dict__裡面有沒有set,get,delitem這三個function
04/08 19:55, 5F

04/08 19:56, , 6F
如果有就可用,沒有的話就丟一個attributeError回來(假裝
04/08 19:56, 6F

04/08 19:58, , 7F
update()不存在 因為沒找到object的類別定義所以猜想一下
04/08 19:58, 7F

04/08 20:02, , 8F
這裡並不確定 如果版上各位大大知道也請不吝賜教 :)
04/08 20:02, 8F
文章代碼(AID): #1FWIVAaS (Python)
文章代碼(AID): #1FWIVAaS (Python)