内部类方法应该返回值还是只修改实例变量? [英] Should internal class methods return values or just modify instance variables?
问题描述
我正在创建一个查询构建器类,该类将帮助从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屋!