python - 使用 OOP 和代理模式的字符串构造

标签 python oop design-patterns sqlalchemy proxy-pattern

我发现 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:对不起我的英语,它不是我的主要语言。

最佳答案

实际上您看到的不是代理模式,而是 builder pattern ,是的,您的实现是恕我直言,是经典实现(使用 Fluent interface 模式)。

关于python - 使用 OOP 和代理模式的字符串构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822101/

相关文章:

c# - 我应该使用命令模式而不是调用静态方法吗?

java - 在 Android 中匹配正则表达式

python - 将 DAG 渲染为表格的算法

python - 关闭缓冲

python - conda 安装的软件包不适用于 jupyter

Java:在大型项目实践中将文件处理代码放在哪里

python - 格式化二维网格中的路径打印

c# - .NET 中的链接构造函数

java - Scanner 为什么要实现 Iterator<String>?

c# - 从您打算测试的类继承是否总是次优的?