看板 Python 關於我們 聯絡資訊
說實在我也不知道怎麼樣定這個標題 直接上code 應該會比較清楚 #這邊我以redis-py作為範例,問題本身與redis毫無關係 import redis class Redis: def __init__(self): self.conn = redis.StrictRedis() # 這邊我想要讓self的method直接繼承self.conn下面的所有methods # (不知道用「繼承」這個詞對不對) self.keys = self.conn.keys self.hget = self.conn.hget self.hgetall = self.conn.hgetall self.delete = self.conn.delete client = Redis() 於是乎 我今天如果要得到所以keys 我可以用 client.keys('*') 也就完全等於 client.conn.keys('*') 我可以手動在__init__裡面 一個一個慢慢對應 但是這樣就違反DRY的原則了 而且也很不聰明 這樣作的目的只是想讓code短一點 不知道這種技巧叫什麼 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.233.165 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1447838420.A.213.html
uranusjr: 實作 __getattr__ 然後用 getattr(self.conn, name) 11/18 17:46
uranusjr: 參考 http://d.pr/19YDhhttp://d.pr/11fNI 11/18 17:47
感謝,我希望我沒有會錯意 以下是我改正的版本 如果有誤煩請指正 謝謝! class Redis: def __init__(self): self.conn = redis.StrictRedis() def __getattr__(self, attr): return getattr(self.conn, attr) ※ 編輯: amigcamel (61.220.233.165), 11/18/2015 18:08:52
bibo9901: 這樣不算違反DRY啊? 只是code長一點而已 11/18 18:07
bibo9901: 不然也可以這樣 http://tinyurl.com/o5cyvsk 11/18 18:10
bibo9901: 用__getattr__等於你所有attr都去self.conn找了, 那又何 11/18 18:11
bibo9901: 必新弄一個class 11/18 18:11
這只是demo code 建這個class 是因為我可以在這個class增加其他額外method ※ 編輯: amigcamel (61.220.233.165), 11/18/2015 18:14:58