gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:06:37 26 4
gpt4 key购买 nike

我发现 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com