[問題] class method alias

看板Python作者 (阿吉amig)時間10年前 (2015/11/18 17:20), 10年前編輯推噓0(006)
留言6則, 2人參與, 最新討論串1/1
說實在我也不知道怎麼樣定這個標題 直接上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

11/18 17:46, , 1F
實作 __getattr__ 然後用 getattr(self.conn, name)
11/18 17:46, 1F

11/18 17:47, , 2F
11/18 17:47, 2F
感謝,我希望我沒有會錯意 以下是我改正的版本 如果有誤煩請指正 謝謝! 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

11/18 18:07, , 3F
這樣不算違反DRY啊? 只是code長一點而已
11/18 18:07, 3F

11/18 18:10, , 4F
不然也可以這樣 http://tinyurl.com/o5cyvsk
11/18 18:10, 4F

11/18 18:11, , 5F
用__getattr__等於你所有attr都去self.conn找了, 那又何
11/18 18:11, 5F

11/18 18:11, , 6F
必新弄一個class
11/18 18:11, 6F
這只是demo code 建這個class 是因為我可以在這個class增加其他額外method ※ 編輯: amigcamel (61.220.233.165), 11/18/2015 18:14:58
文章代碼(AID): #1MJ4BK8J (Python)
文章代碼(AID): #1MJ4BK8J (Python)