python中哪种面向对象设计模式更好
我已经多次遇到这个决定,似乎应该有一个“正确”的方法来做到这一点。我想知道:在我的类中,方法返回值还是将其存储为对象的属性更好?下面是我的例子: 哪种设计模式更好python中哪种面向对象设计模式更好,python,oop,Python,Oop,我已经多次遇到这个决定,似乎应该有一个“正确”的方法来做到这一点。我想知道:在我的类中,方法返回值还是将其存储为对象的属性更好?下面是我的例子: 哪种设计模式更好 import requests class WebResource1(object): def __init__(self, params): self.params = params def parse_url(self): self.url = 'http://mywebsite
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
其他地方”,有人能评论一下哪个选项更具可扩展性吗?哪个更易于维护?在这种情况下,我会将parse_url设置为private,并从构造函数调用它,以使类的接口更清晰。可能完全删除parse_URL,然后在构造函数中执行它
一般来说,如果调用很快,我会使用get,如果我需要在整个类中多次查看值,我会使用self属性。IMHO(是的,这是基于观点的),这完全取决于您希望通过界面设计表达什么。整个模式必须有意义。例如,您是否计划允许类的用户调用parse\u url
,并获取用于获取资源的url?或者先调用webres2.parse_url()
,然后调用webres2.url
,这样做有意义吗?用户可能会忘记调用parse_url
,并且该属性不存在,或者具有错误的值
据我所知,WebResource1
更像是一种模式,您希望将复杂任务拆分为多个内部函数,只有类设计器知道内部属性何时设置为正确的值。在这种情况下,最好在parse_url
前面加一个下划线,以表明函数不是为从外部调用而设计的(这可能适合self.\u url
)
另一方面,在
WebResource2
中,parse\u url
似乎更像一个getter函数,可以从内部或外部使用。在这里,您还可以将其更改为属性
我知道您特别要求使用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))
我非常不喜欢在
\uuuu init\uuuu
之外设置实例属性,但这不是一成不变的规则。无论如何,我认为这太基于观点了。有人可能会说您的示例根本不需要类。另一个答案是“您是否曾经在同一时间需要每个资源多个URL?”将其存储为属性意味着如果您再次调用parse\u URL
,它将覆盖旧值。如果返回值,可以用自己的方式存储多个值。我会使用工厂方法,good[link]()