これは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
クラスの一般的なメソッドを定義したいので、私はこのプロセスで何かを見逃しています。url
をTemplate
に渡す必要があります。
次のコードが有効になるようにこれを設定する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
なぜ 'Templates.get_template(url)'が機能しないのですか? –
とにかく、通常は 'staticmethod'ではなく' classmethod'を使います。率直に言って、私が 'staticmethod'の使用を見る唯一の時は、Javaのような言語から来てモジュールレベルの機能を許さない人が習慣を揺さぶることができないからです。 –