作者amigcamel (阿吉amig)
看板Python
標題[問題] class method alias
時間Wed Nov 18 17:20:18 2015
說實在我也不知道怎麼樣定這個標題
直接上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
感謝,我希望我沒有會錯意
以下是我改正的版本
如果有誤煩請指正
謝謝!
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: 用__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