我已经多次遇到过这个决定,似乎应该采用“正确”的方式来做到这一点。我想知道:在我的课程中,方法返回值或将其存储为对象的属性是否更好?这是我的例子:
哪种设计模式更好?
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
其他地方”,有人可以评论哪个选项更具可扩展性吗?哪个更易于维护?
答案 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
。