作者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://webptt.com/cn.aspx?n=bbs/Python/M.1447838420.A.213.html
1F:→ 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
3F:→ bibo9901: 这样不算违反DRY啊? 只是code长一点而已 11/18 18:07
5F:→ bibo9901: 用__getattr__等於你所有attr都去self.conn找了, 那又何 11/18 18:11
6F:→ bibo9901: 必新弄一个class 11/18 18:11
这只是demo code
建这个class
是因为我可以在这个class增加其他额外method
※ 编辑: amigcamel (61.220.233.165), 11/18/2015 18:14:58