2017-08-26 1 views
0

Ich versuche, eine einfache SQL-Builder-Klasse zu erstellen, aber wenn ich versuche, die Ausgabe von import_ zu drucken scheint es nicht den Inhalt von get_sql, obwohl seine in __str__ Funktion. Was mache ich falsch?__str__ Methode wird nicht beim Drucken aufgerufen

class Query(object): 
    """ 
    Query builder entry functions 
    """ 
    @classmethod 
    def _builder(cls): 
     return QueryBuilder() 

    @classmethod 
    def import_(cls, source_type): 
     return cls._builder().import_(source_type) 


class QueryBuilder(object): 
    """ 
    Query Builder is the main class that generates sql 
    """ 
    def __init__(self, quote_char='"'): 
     self._from = [] 
     self._import = None 
     self._source_type = None 
     self.quote_char = quote_char 

    def import_(self, source_type): 
     if source_type == SourceType.XML: 
      raise KeyError('Importing a XML is not supported') 
     self._source_type = source_type 

    def __str__(self): 
     return self.get_sql(quote_char='"') 

    def get_sql(self): 
     if not (self._import): 
      return 'test' 
     return 'e' 

drucken Skript:

importQuery = Query.import_(sourceTypeEnum) 
print(importQuery) 
+0

Verwenden Sie eine IDE oder Jupyter? Wenn Sie nur den Variablennamen schreiben, ohne "print" aufzurufen, rufen Sie stattdessen "__repr__" auf. –

+0

haben jetzt Skript hinzugefügt –

+0

Factory-Muster-Funktionen müssen 'selbst zurückgeben', so können Sie 'importQuery = Query.import _ ..'. Andernfalls können Sie Objekte nur mit dem Klassenkonstruktor erstellen. – Vinny

Antwort

1

Sie benötigen einen return self am Ende Ihres QueryBuilder.import_ Methode hinzufügen, sonst wird es None zurückkehren und die deshalb importQuery wird None sein - nicht eine Instanz Ihrer QueryBuilder wie du es erwartet hast.

+1

Nur das 'return self' erlaubt es auch,' import_' -Anrufe zu verketten, was es zu einem richtigen Builder-Muster macht. –

Verwandte Themen