2017-08-01 9 views
1

これはPythonクラスへの私の最初の本当の進出ですので、用語の誤用をお許しください。グローバルメソッドを定義する際に、継承クラスからサブクラスを動的に選択する方法

私は、ユーザーが提供するURLに基​​づいて、サブクラスを動的に選択するアプローチを使用しようとしています。ここで私が持っている設定だ:

import requests 
from bs4 import BeautifulSoup as BS 

class Templates(object): 
    def __init__(self, url): 
     self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'} 
     self.url = url 

    def url(self): 
     return self.url 

    def response(self): 
     return self.response 

    def text(self): 
     return self.text 

    def dom(self): 
     return self.dom 

    @staticmethod 
    def get_template(url): 
     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'} 
     response = requests.get(url, headers=headers) 
     text = response.text 
     if 'Website by Dealer.com' in text: 
      return Dealer(url) 
     else: 
      return None 

class Dealer(Templates): 
    def __init__(self, url): 
     Templates.__init__(self, url) 
     self.new_vehicle_url = "{}/new-inventory/index.htm".format(self.url.rstrip('/')) 
     self.used_vehicle_url = "{}/used-inventory/index.htm".format(self.url.rstrip('/')) 

私が行うことができるようにしたい何がTemplates.get_template(url)を呼び出し、それが適切なサブクラスを返す必要があります。 This questionは本当に簡単に見えましたが、Templatesクラスの一般的なメソッドを定義したいので、私はこのプロセスで何かを見逃しています。urlTemplateに渡す必要があります。

次のコードが有効になるようにこれを設定するPythonの方法は何ですか?それはTemplates.__init__中のためurlパラメータが欠落しているため失敗した - あなたはTemplates()を使用しますが、それは実際にTemplatesのインスタンスを作成しようとすると、あなたのコードで

template = Templates().get_template(url) # assume returns Dealer() 
template.url 
# 'http://www.some-website.com' 
template.response.status_code 
# 200 
+0

なぜ 'Templates.get_template(url)'が機能しないのですか? –

+1

とにかく、通常は 'staticmethod'ではなく' classmethod'を使います。率直に言って、私が 'staticmethod'の使用を見る唯一の時は、Javaのような言語から来てモジュールレベルの機能を許さない人が習慣を揺さぶることができないからです。 –

答えて

1

しかし、あなたはstaticmethodを呼び出すためにインスタンスを必要としません:

template = Templates.get_template(url) # assume returns Dealer() 
template.url 
# 'http://www.some-website.com' 
template.response.status_code 
# 200 

私はちょうどそこTemplates()を削除しました。

+0

いつも何か簡単です...助けてくれてありがとう! – brittenb

+0

@brittenb問題ありません。私は助けてうれしいよ:) – MSeifert

関連する問題