2017-02-13 4 views
0

私はパラメータでURLを受け取り、ニュースサイトでクローラを起動するPythonクラスを持っています。OOP PYTHON:__init__を呼び出さずにcls()を使用して複数のコンストラクタを作成する

オブジェクトの作成が完了すると、オブジェクトはElasticsearchクラスタに格納されます。

私は、Elasticsearchドキュメントを入力し、そこからオブジェクトを作成するメソッドを作成したいと考えています。問題がある

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'] 
     . 
     . 
     . 

、私が呼んでいる...

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

... __init__が呼ばれると私のクローラを起動します方法。とにかくクローラを起動しない、またはinitメソッドを呼び出すことはありませんか?シンプルifとデフォルトパラメータcrawlについて

+1

だからあなたがオブジェクトを初期化せずにオブジェクトを作成したいですか? –

+1

あなたの '__init__'にクローラを置いてはいけないかもしれません。 – khelwood

+0

@StevenSummers 2つの異なるコンストラクタを持つことができるかどうか2つを知りたい場合は – mel

答えて

1

方法:

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

私はあなたの言うことをやったし、from_crawledというクラスメソッドで自分のクローラをinitから取り出しました。 ifステートメントは、initの引数に応じてfrom_crawledまたはfrom_elasticsearchを呼び出します。それは良い建築ですか? @classmethodを使うべきですか? – mel

+0

いいですね。クラスメソッドの使用も妥当と思われます。 –

+0

どちらをお勧めしますか?私のinitメソッドを使って自分の属性の型を定義し、クラスメソッドを使ってオブジェクトを作成するか、init文にif文を入れ、メソッドとElasticsearchからの応答をパラメータとして追加しますか? – mel

関連する問題