作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] python 自己跑出来的class method的问题
时间Sun Apr 8 13:53:11 2012
※ 引述《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
2F:推 bob123:赞! 不过在下有另个想法想请教一下 因为以这种方式要使 04/08 19:51
3F:→ bob123:class变为iterable 必须要继承object 感觉起来很像object 04/08 19:52
4F:→ bob123:个class里面本来就有定个update(), update()被呼叫时先看看 04/08 19:54
5F:→ bob123:self.__dict__里面有没有set,get,delitem这三个function 04/08 19:55
6F:→ bob123:如果有就可用,没有的话就丢一个attributeError回来(假装 04/08 19:56
7F:→ bob123:update()不存在 因为没找到object的类别定义所以猜想一下 04/08 19:58
8F:→ bob123:这里并不确定 如果版上各位大大知道也请不吝赐教 :) 04/08 20:02