【发布时间】:2011-12-10 22:45:23
【问题描述】:
我发现 SQLAlchemy 构造查询字符串的方式非常有趣,例如:
(Session.query(model.User)
.filter(model.User.age > 18)
.order_by(model.User.age)
.all())
据我所知,那里应用了某种代理模式。在我的小项目中,我需要使用 OOP 方法进行类似的字符串构造。所以,我试图重构这种行为。
首先,某种对象,许多相似对象之一:
class SomeObject(object):
items = None
def __init__(self):
self.items = []
def __call__(self):
return ' '.join(self.items) if self.items is not None else ''
def a(self):
self.items.append('a')
return self
def b(self):
self.items.append('b')
return self
这个对象的所有方法都返回self,所以我可以按任意顺序和无限次调用它们。
其次,代理对象,如果不是 perform 方法,它将调用主体的方法,该方法调用对象来查看结果字符串。
import operator
class Proxy(object):
def __init__(self, some_object):
self.some_object = some_object
def __getattr__(self, name):
self.method = operator.methodcaller(name)
return self
def __call__(self, *args, **kw):
self.some_object = self.method(self.some_object, *args, **kw)
return self
def perform(self):
return self.some_object()
最后:
>>> obj = SomeObject()
>>> p = Proxy(obj)
>>> print p.a().a().b().perform()
a a b
你对这个实现有什么看法?有没有更好的方法来制作所需数量的类,以使这样的字符串具有相同的语法?
PS:对不起,我的英语不是我的主要语言。
【问题讨论】:
-
为什么不看看 SQLAlchemy 代码,看看他们是如何做到的?
标签: python oop design-patterns sqlalchemy proxy-pattern