[英]Recursive class definitions in Python
我正在使用Python中的流畅接口进行实验。
一个流畅的SQL查询生成器的示例在使用中看起来像这样:
sql.select('foo').select('bar').from('sometable').tostring()
我很快意识到递归定义嵌套类的能力可能会有所帮助。
class sql:
class select:
class select # <-- HERE
def __init__(self, dbcolumn, astype=None, asname=None):
self.dbcolumn = dbcolumn
self.astype = astype
self.asname = asname
在标有评论'#< - HERE'的行中:
我希望这个嵌套类引用引用包含类的相同“select”类定义。
这有可能吗? 也许使用一些我不知道的关键字?
不需要“递归类定义”。 允许链接的所有操作都是在方法中返回self
(如果对象不可变或某些方法不应修改输入对象,则返回同一类的实例)。
例:
>>> class SQL(object):
... def __init__(self):
... self.columns = []
... def select(self, col):
... self.columns.append(col)
... return self
...
>>> s = SQL()
>>> s.select('foo').select('bar').columns
['foo', 'bar']
您正在使用方法混淆类 。
select
是class sql
实例上的方法,而不是嵌套类。 它可以返回另一个实例。
class SelectStatement(object):
def select(self, tablename):
return SelectStatement()
class SQL(object):
def select(self, tablename):
return SelectStatement()
看一下SQLAlchemy的源代码; 它就是这样做的; 从结构python类生成SQL,您可以通过以这种方式调用实例上的方法来优化查询。 例如,可以链接一系列连接:
q = session.query(User).join(User.orders).join(Order.items).join(Item.keywords)
正如问题的标题所示,我真的想知道如何递归地嵌套类定义。 我相信有很多方法可以“让流畅的界面在蟒蛇猫皮肤上”。
我找到了一种使用装饰器递归嵌套类定义的方法:
# class decorator
def recursiveclass(decorated_class):
decorated_class.__dict__[decorated_class.__name__] = decorated_class
return decorated_class
#fluent interface
class sql:
@recursiveclass
class select:
def __init__(self, dbcolumn, astype=None, asname=None):
self.dbcolumn = dbcolumn
self.astype = astype
self.asname = asname
请注意,我并不是说这是在Python中实现流畅界面的最佳方式。 我只是在试验。
核实:
dir(sql.select.select.select.select)
['__doc__', '__init__', '__module__', 'select']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.