【发布时间】:2013-02-11 14:56:21
【问题描述】:
我用 Python 编程已经有一段时间了,并且已经掌握了一些 Python 风格的知识,但在如何正确使用类方面仍然存在问题。 在阅读面向对象的讲座时,我经常发现像单一责任原则这样的规则
“单一职责原则说一个类应该有 一个,也是唯一一个改变的理由”
读到这里,我可能会想到将一个班级分成两个班级,例如:
class ComplicatedOperations(object):
def __init__(self, item):
pass
def do(self):
...
## lots of other functions
class CreateOption(object):
def __init__(self, simple_list):
self.simple_list = simple_list
def to_options(self):
operated_data = self.transform_data(self.simple_list)
return self.default_option() + operated_data
def default_option(self):
return [('', '')]
def transform_data(self, simple_list):
return [self.make_complicated_operations_that_requires_losts_of_manipulation(item)
for item in simple_list]
def make_complicated_operations_that_requires_losts_of_manipulation(self, item):
return ComplicatedOperations(item).do()
对我来说,这引发了许多不同的问题;喜欢:
- 什么时候应该使用类变量或在类函数中传递参数?
-
ComplicatedOperations类应该是一个类还是只是一组函数? - 是否应该使用
__init__方法来计算最终结果。这是否会使该课程难以测试。 - pythonists 的规则是什么?
回答后编辑:
所以,阅读奥古斯托的理论,我最终会得到这样的结论:
class ComplicatedOperations(object):
def __init__(self):
pass
def do(self, item):
...
## lots of other functions
def default_option():
return [('', '')]
def complicate_data(item):
return ComplicatedOperations().do(item)
def transform_data_to_options(simple_list):
return default_option() + [self.complicate_data(item)
for item in simple_list]
(还修正了 default_option 的一个小错误。)
【问题讨论】:
-
也许这只是我的看法,但是如果类方法不共享任何 state —— 即如果你可以编写所有函数 没有
self,那么它没有理由成为一个类... -
重命名并标记tag:srp 以强调单一责任原则
标签: python class oop single-responsibility-principle