如何在定义全局方法时从继承的 class 中动态选择 subclass
How to dynamically choose subclass from inherited class while defining global methods
这是我第一次真正涉足 Python classes,所以请原谅任何误用术语。
我正在尝试使用 Factory Pattern 方法根据用户提供的 URL 动态选择子 class。这是我的设置:
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)
并让它 return 合适的子 class。 This question 让它看起来很简单,但我在这个过程中遗漏了一些东西,因为我还想在我的 Templates
class 中定义通用方法,这需要我通过 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
的实例 - 但失败了,因为它缺少 Templates.__init__
中的 url
参数。
但是你不需要实例来调用静态方法:
template = Templates.get_template(url) # assume returns Dealer()
template.url
# 'http://www.some-website.com'
template.response.status_code
# 200
我刚刚删除了 Templates
之后的 ()
。
这是我第一次真正涉足 Python classes,所以请原谅任何误用术语。
我正在尝试使用 Factory Pattern 方法根据用户提供的 URL 动态选择子 class。这是我的设置:
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)
并让它 return 合适的子 class。 This question 让它看起来很简单,但我在这个过程中遗漏了一些东西,因为我还想在我的 Templates
class 中定义通用方法,这需要我通过 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
的实例 - 但失败了,因为它缺少 Templates.__init__
中的 url
参数。
但是你不需要实例来调用静态方法:
template = Templates.get_template(url) # assume returns Dealer()
template.url
# 'http://www.some-website.com'
template.response.status_code
# 200
我刚刚删除了 Templates
之后的 ()
。