这是我对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

关于python - 如何在定义全局方法的同时从继承的类中动态选择子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45442628/

10-12 18:18