Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中哪种面向对象设计模式更好_Python_Oop - Fatal编程技术网

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]()