2017-08-01 44 views
1

这是我第一次真正进入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 
+0

为什么'Templates.get_template(url)'不工作? –

+1

无论如何,通常你会使用'classmethod'而不是'staticmethod'。坦率地说,我看到使用'staticmethod'的唯一时代是来自像Java这样的语言的人们,它们不允许模块级别的功能,并且不能改变习惯。 –

回答

1

在你的代码使用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有后,我只是删除了()

+0

这总是很简单......感谢您的帮助! – brittenb

+0

@brittenb没问题。我很高兴帮助:) – MSeifert