簡體   English   中英

Python中的遞歸類定義

[英]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']

您正在使用方法混淆

selectclass 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM