如何处理部分初始化的类

时间:2014-01-14 18:51:01

标签: python class oop

我的问题涉及我正在撰写的课程,可能会或可能不会完全初始化。基本目标是获取match_id并打开相应的match_url(示例:http://dota2lounge.com/match?m=1899),然后从网页中抓取一些属性。问题是某些match_ids会产生404页(http://dota2lounge.com/404)。

如果发生这种情况,将无法确定匹配的获胜者,因此Match的其余部分无法初始化。我已经看到这会导致Match的方法出现问题,因此如果Noneself._valid_url,我会添加行以将所有内容初始化为False。这在原理上是有效的,但是每次添加新属性时我都会添加一行,并且它似乎容易在管道中出错(在方法等中)它也不会提醒用户这个类不是'正确初始化。他们需要致电.is_valid_match()来确定。

tl; dr:处理可能只是部分启动的类的最佳方法是什么?由于这是一个业余爱好项目,我正在寻求学习,我很开心任何解决方案(尝试新事物),包括其他类或其他什么。感谢。

这是包含相关部分的代码的缩写版本(Python 3.3):

from urllib.request import urlopen
from bs4 import BeautifulSoup


class Match(object):
    def __init__(self, match_id):
        self.match_id = match_id
        self.match_url = self.__determine_match_url__()
        self._soup = self.__get_match_soup__()
        self._valid_match_url = self.__determine_match_404__()
        if self._valid_match_url:
            self.teams, self.winner = self.__get_teams_and_winner__()

        # These lines were added, but I'm not sure if this is correct.
        else:
            self.teams, self.winner = None, None

    def __determine_match_url__(self):
        return 'http://dota2lounge.com/match?m=' + str(self.match_id)

    def __get_match_soup__(self):
        return BeautifulSoup(urlopen(self.match_url))

    def __get_match_details__(self):
        return self._soup.find('section', {'class': 'box'})

    def __determine_match_404__(self):
        try:
            if self._soup.find('h1').text == '404':
                return False
        except AttributeError:
            return True

    def __get_teams_and_winner__(self):
        teams = [team.getText() for team in
                 self._soup.find('section', {'class': 'box'}).findAll('b')]
        winner = False
        for number, team in enumerate(teams):
            if ' (win)' in team:
                teams[number] = teams[number].replace(' (win)', '')
                winner = teams[number]

        return teams, winner

    def is_valid_match(self):
        return all([self._valid_match_url, self.winner])

1 个答案:

答案 0 :(得分:4)

我会引发一个异常,在你的创建代码中处理它(无论你在哪里调用some_match = Match(match_id)),并且可能不会将它添加到你可能使用或不使用的任何列表中......

要获得更好的答案,您可能希望在您的问题中包含实例化所有Match个对象的代码。