代码之家  ›  专栏  ›  技术社区  ›  tblznbits

如何在定义全局方法时从继承的类中动态选择子类

  •  2
  • tblznbits  · 技术社区  · 8 年前

    这是我第一次真正深入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
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   MSeifert    8 年前

    在您使用的代码中 Templates() Templates -它失败了,因为它缺少 url 中的参数 Templates.__init__ .

    但不需要实例来调用staticmethod:

    template = Templates.get_template(url) # assume returns Dealer()
    template.url
    # 'http://www.some-website.com'
    template.response.status_code
    # 200
    

    () 之后 模板