2017-02-13 3 views
0

Ich habe eine Python-Klasse, die eine URL in Parameter übernimmt und einen Crawler auf einer Nachrichtenwebsite startet.OOP PYTHON: Verwenden von cls() zum Erstellen mehrerer Konstruktoren ohne Aufruf von __init__

Sobald die Erstellung des Objekts abgeschlossen ist, wird das Objekt in einem Elasticsearch-Cluster gespeichert.

Ich möchte eine Methode erstellen, die das Elasticsearch-Dokument eingibt und ein Objekt daraus erstellt.

class NewsArticle(): 

    def __init__(self, url): 
     self.url = url 
     # Launch a crawler and fill in the other fields like author, date, ect ... 

    @classmethod 
    def from_elasticsearch(cls, elasticsearch_article): 
     document = elasticsearch_article['_source'] 
     obj = cls(document['url']) 
     obj.url = document['url'] 
     obj.author = document['author'] 
     . 
     . 
     . 

Das Problem ist, wenn ich rufe ...

# response is my document from elasticsearch 
res = NewsArticle.from_elasticsearch(response) 

... die Methode __init__ wird aufgerufen und wird mein Crawler starten. Gibt es trotzdem, dass es meinen Crawler nicht startet oder die init-Methode aufruft?

+1

So möchten Sie ein Objekt erstellen, ohne ein Objekt zu initialisieren? –

+1

Vielleicht solltest du dieses Crawler-Zeug nicht in deinem '__init__' haben. – khelwood

+0

@StevenSummers Ich möchte zwei wissen, wenn ich 2 differents Konstruktoren haben kann – mel

Antwort

1

Wie wäre es einfacher if und Standardparameter crawl:

class NewsArticle(): 

    def __init__(self, url, crawl=True): 
     self.url = url 
     if crawl: 
      # Launch a crawler and fill in the other fields like author, date, ect ... 

    @classmethod 
    def from_elasticsearch(cls, elasticsearch_article): 
     document = elasticsearch_article['_source'] 
     obj = cls(document['url'], crawl=False) 
     obj.url = document['url'] 
     obj.author = document['author'] 
+0

Ich habe getan, was Sie sagen, und ich nahm auch meinen Crawler aus der init in einer Klassenmethode namens From_crawled. Die if-Anweisung ruft from_crawled oder from_elasticsearch auf, abhängig vom Argument im init. Ist das eine gute Architektur? Sollte ich @classmethod verwenden? – mel

+0

Hört sich gut an. Die Verwendung der Klassenmethode sieht ebenfalls vernünftig aus. –

+0

Was empfehlen Sie: Verwenden Sie meine Init-Methode nur, um den Typ meiner Attribute zu definieren und Klassenmethode zu verwenden, um meine Objekte zu erstellen oder eine if-Anweisung in meine init einzufügen und die Methode und die Antwort von Elasticsearch als Parameter hinzuzufügen? – mel

Verwandte Themen