簡體   English   中英

如何進行function()。function()?

[英]how to proceed function().function()?

我正在尋找這樣的功能:

select().orderBy()其中,首先調用select() select().orderBy() ,然后調用orderBy()

為此,我將一個方法定義為select方法,如下所示:

def select(self):
    if self.key is not None:
        self.request = """SELECT """ + self.key[0] + """ FROM """ + self.table
    else:
        self.request = """SELECT * FROM """ + self.table

    def where():
         self.request += """ WHERE """ + self.key[0] + """ = """ + self.value[0]
         return self.request
    def orderBy(key, value):
        self.request += """ ORDER BY """ + key + """ """ + value
        return self.request
    def groupBy(arg):
        self.request += """ GROUP BY """ + arg
        return self.request
    def limit(arg):
        self.request += """ LIMIT """ + arg
        return self.request

但是我有這個錯誤信息:

AttributeError: 'NoneType' object has no attribute 'orderBy'

有人知道該怎么做嗎?

鏈接方法(流暢的或生成的API)僅在前一個調用返回支持下一個方法的對象時才有效; foo().bar()foo()必須返回具有.bar()方法的對象。 您的.select()方法返回None ,該對象不支持任何其他方法。

您的select函數應該返回self

return self

使通話可鏈接。 您可能還希望其他調用也返回self ,而不是self.request 我在這里假設其他方法確實是同一類上的方法(您的示例缺少每個方法的self參數)。

如果你想擁有這些方法只能是因為你嵌套他們里面select()方法,則不會在所有的工作。 這些函數對象只是函數主體中未使用的本地名稱,在返回的對象上不可用。

如果這些方法不應存在於定義select的同一類上,請定義一個類,並讓該類實現您的額外方法。 select()返回該類的實例:

class Selectable:
    # ...
    def select(self):
        column = '*' if new_clone.key is None else new_clone.key
        request = """SELECT {} FROM {}""".format(column, new_clone.table)
        return Query(request)

class Query:
    def __init__(self, request):
        self.request = request
    def where(self):
         self.request += """ WHERE """ + self.key[0] + """ = """ + self.value[0]
         return self
    def orderBy(self, key, value):
        self.request += """ ORDER BY """ + key + """ """ + value
        return self
    def groupBy(self, arg):
        self.request += """ GROUP BY """ + arg
        return self
    def limit(self, arg):
        self.request += """ LIMIT """ + arg
        return self

請注意, Query()上的每個方法都返回self因此您可以繼續進行鏈接。

但是,您隨后將操縱同一實例,並且將無法從通用基礎創建單獨的查詢對象。 SQLAlchemy可以做得更好。 它返回self克隆 ,並帶有以下更改:

def _clone(self):
    return type(self)(self.request)

def where(self):
    new_clone = self._clone()
    new_clone.request += """ WHERE {} = {}""".format(self.key[0], self.value[0])
    return new_clone

現在, base = Selectable().select()filtered = base.where()使filtered成為一個不同的克隆,因此您可以繼續使用base來構建其他查詢。

(實際上,SQLAlchemy使用一個裝飾器 ,用一個新創建的clone替換self )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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