這是我第一次真正進入Python類,因此請原諒任何濫用條款。如何在定義全局方法時從繼承類動態選擇子類
我正在嘗試使用Factory Pattern方法根據用戶提供的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
。
什麼是Pythonic的設置方式,以便下面的代碼可以工作?
template = Templates().get_template(url) # assume returns Dealer()
template.url
# 'http://www.some-website.com'
template.response.status_code
# 200
爲什麼'Templates.get_template(url)'不工作? –
無論如何,通常你會使用'classmethod'而不是'staticmethod'。坦率地說,我看到使用'staticmethod'的唯一時代是來自像Java這樣的語言的人們,它們不允許模塊級別的功能,並且不能改變習慣。 –