2017-08-01 50 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