哪个是python中更好的面向对象设计模式

时间:2014-02-03 19:38:52

标签: python oop

我已经多次遇到过这个决定,似乎应该采用“正确”的方式来做到这一点。我想知道:在我的课程中,方法返回值或将其存储为对象的属性是否更好?这是我的例子:

哪种设计模式更好?

import requests

class WebResource1(object):
    def __init__(self, params):
        self.params = params

    def parse_url(self):
        self.url = 'http://mywebsite.com/?' + [key + '=' value + '&' for key, value in self.params.iteritems()]

    def fetch_resource(self):
        self.parse_url()
        return requests.get(self.url)

class WebResource2(object):
    def __init__(self, params):
        self.params = params

    def parse_url(self):
        url = 'http://mywebsite.com/?' + [key + '=' value + '&' for key, value in self.params.iteritems()]
        return url

    def fetch_resource(self):
        url = self.parse_url()
        return requests.get(url)

如果答案是“这取决于你是否需要self.url其他地方”,有人可以评论哪个选项更具可扩展性吗?哪个更易于维护?

3 个答案:

答案 0 :(得分:1)

据我所知,您已经特别要求提供OO解决方案。但作为替代方案,您可以考虑使用dict和函数。他们真的可以带你走得很远。

def parse_url(params):
    return 'http://mywebsite.com/?' + [key + '=' value + '&' for key, value in params.iteritems()]

def fetch_resource(params):
    return requests.get(parse_url(params))

答案 1 :(得分:0)

在这种情况下,我会将parse_url设为private并从构造函数中调用它,以使类的接口更清晰。也许完全删除parse_URL并在构造函数中执行它。

作为一般规则,如果我需要在整个班级中多次查看该值,我会使用get来调用快速和self属性。

答案 2 :(得分:0)

恕我直言(是的,这是基于意见的),这完全取决于您想通过界面设计表达的内容。整个模式必须有意义。例如,您是否计划让该类用户调用parse_url并获取用于获取资源的URL?或者首先调用webres2.parse_url()然后调用webres2.url是否有意义,因为之前用户忘记调用parse_url并且该属性不存在或者值不正确。

据我了解,WebResource1更像是一种模式,您希望在多个内部函数中拆分复杂任务,只有类设计者知道何时使用适当的值设置内部属性。在这种情况下,最好在parse_url前加上下划线,以表明该函数不是为从外部调用而设计的(同样适合self._url)。

另一方面,在WebResource2中,parse_url似乎更像是一个可以在内部或外部使用的getter函数。您也可以在此处将其更改为property

相关问题