内部类方法应该返回值还是只修改实例变量? [英] Should internal class methods return values or just modify instance variables?

查看:64
本文介绍了内部类方法应该返回值还是只修改实例变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个查询构建器类,该类将帮助从URL参数构造对mongodb的查询.除了使用基本语言构造和使用django的内置模型外,我从来没有做过太多面向对象的编程,也没有设计过供我以外的人使用的类.

I am creating a query builder class that will help in constructing a query for mongodb from URL params. I have never done much object oriented programming, or designed classes for consumption by people other than myself, besides using basic language constructs and using django's built in Models.

所以我有这个QueryBuilder

class QueryHelper():
    """
    Help abstract out the problem of querying over vastly
    different dataschemas.
    """

    def __init__(self, collection_name, field_name, params_dict):
        self.query_dict = {}
        self.params_dict = params_dict
        db = connection.get_db()
        self.collection = db[collection_name]

    def _build_query(self):
        # check params dict and build a mongo query
        pass

现在在_build_query中,我将检查params_dict并填充query_dict,以便将其传递给mongo的find()函数. 在执行此操作时,我只是想知道是否存在一种绝对正确的方法,如_build_query是否应返回字典还是仅应修改self.query_dict.由于它是一种内部方法,因此我认为只需修改self.query_dict就可以了.有没有正确的方法(pythonic)来解决这个问题?这仅仅是愚蠢的,不是重要的设计决定吗?感谢您的帮助.

Now in _build_query I will be checking the params_dict and populating query_dict so as to pass it to mongo's find() function. In doing this I was just wondering if there was an absolute correct approach to as whether _build_query should return a dictionary or whether it should just modify self.query_dict. Since it is an internal method I would assume it is OK to just modify self.query_dict. Is there a right way (pythonic) way of approaching this? Is this just silly and not an important design decision? Any help is appreciated.

推荐答案

最好返回一个值,因为它允许您将所有修改的属性保留在一个位置(__init__).同样,这使得以后扩展代码更容易.假设您要重写子类中的_build_query,则重写方法可以仅返回一个值,而无需知道要设置哪个属性.这是一个示例:

Returning a value is preferable as it allows you to keep all the attribute modifying in one place (__init__). Also, this makes it easier to extend the code later; suppose you want to override _build_query in a subclass, then the overriding method can just return a value, without needing to know which attribute to set. Here's an example:

class QueryHelper(object):
    def __init__(self, param, text):
        self._param = param
        self._query = self._build_query(text)

    def _build_query(self, text):
        return text + " and ham!"

class RefinedQueryHelper(QueryHelper):
    def _build_query(self, text):
        # no need to know how the query object is going to be used
        q = super(RefinedQueryHelper, self)._build_query()
        return q.replace("ham", "spam")

vs. 安装程序版本":

vs. the "setter version":

class QueryHelper(object):
    def __init__(self, param, text):
        self._param = param
        self._build_query(text)

    def _build_query(self, text):
        self._query = text + " and ham!"

class RefinedQueryHelper(QueryHelper):
    def _build_query(self, text):
        # what if we want to store the query in __query instead?
        # then we need to modify two classes...
        super(RefinedQueryHelper, self)._build_query()
        self._query = self._query.replace("ham", "spam")

如果您确实选择设置属性,则可能需要调用方法_set_query为清楚起见.

If you do choose to set an attribute, you might want to call the method _set_query for clarity.

这篇关于内部类方法应该返回值还是只修改实例变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆