我有一个类,其中一个方法输出dict
。该类需要实例化file_path。该方法需要一个字符串参数来输出dict。这是一些伪代码。
class A():
def __init__(self, file_path):
self.file_path = file_path
def create_dict(self, param):
#uses self.filepath
#creates a dict called data. The dict contains 2 keys and each key contains a list. The first list is a list of strings and the second a list of integers
return data
在我看来,生成此dict
的过程无关紧要。最终输出如下:
data = {'Key1': ['String1', 'String2', 'String3',....], 'Key2': [1,2,4,....]}
当我开始实现这个课时,我注意到我想让data
成为一个对象。此对象将具有方法data.printKey1()
和data.printKey2()
,它们将输出以下内容:
>>> data.printKey1()
String1
String2
String3
...
>>>data.printKey2()
1
2
4
现在我被卡住了,因为我真的不想重建生成data
的整个过程,但我需要它作为一个对象。
我不确定是否应该使用继承,class containment或composition(或其他一些我不知道的构造)。从理论上讲,这里使用的最佳实践是什么?如何生成这个新的data
类/对象而不必重写create_dict
方法中包含的整个过程?
由于
答案 0 :(得分:1)
你真的需要上课吗?一个简单的函数可以工作:
def printkey(data, key):
for line in data[key]:
print(line)
printkey(data, "key1")
printkey(data, "key2")
实际上,将域逻辑与表示混合是众所周知的反模式。如果你真的想要一个课程(为了让一些心胸狭隘的OO纯粹主义者感到高兴或出于更好的理由而未在你的问题中解释),那么你当然可以写一些“主持人”课程:
class DataPrinter(object):
def __init__(self, data):
self.data = data
def _printkey(self, key):
for line in self.data[key]:
print(line)
def printkey1(self):
self._printkey("key1")
def printkey2(self):
self._printkey("key2")
但这真的是无用的恕我直言,至少对于给定的例子(它可能对一些更复杂的数据模型和演示文稿的东西有意义)。
哦,是的,FWIW,Python函数是ARE对象(类function
的实例)所以你可以告诉一些狭隘的OO-purist,基于函数的解决方案IS实际上也是正确的OO设计xD (可怜的Java家伙必须发明一种设计模式 - “仿函数” - 隐藏这样一个事实,即有时候你需要的只是一个普通的老函数......)。