面向特定应用程序的最佳面向对象python构造

时间:2018-06-01 11:03:24

标签: python oop inheritance composition

我有一个类,其中一个方法输出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 containmentcomposition(或其他一些我不知道的构造)。从理论上讲,这里使用的最佳实践是什么?如何生成这个新的data类/对象而不必重写create_dict方法中包含的整个过程?

由于

1 个答案:

答案 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家伙必须发明一种设计模式 - “仿函数” - 隐藏这样一个事实,即有时候你需要的只是一个普通的老函数......)。