如何在定义全局方法时从继承类动态选择子类
问题描述:
这是我第一次真正进入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()
,但实际上试图创建的Templates
一个实例 - 因为它缺少url
参数为Templates.__init__
其失败。
但你并不需要一个实例来调用一个静态方法:
template = Templates.get_template(url) # assume returns Dealer()
template.url
# 'http://www.some-website.com'
template.response.status_code
# 200
Templates
有后,我只是删除了()
。
为什么'Templates.get_template(url)'不工作? –
无论如何,通常你会使用'classmethod'而不是'staticmethod'。坦率地说,我看到使用'staticmethod'的唯一时代是来自像Java这样的语言的人们,它们不允许模块级别的功能,并且不能改变习惯。 –