Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于特定应用程序的最佳面向对象python构造_Python_Oop_Inheritance_Composition - Fatal编程技术网

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

用于特定应用程序的最佳面向对象python构造,python,oop,inheritance,composition,Python,Oop,Inheritance,Composition,我有一个类,它有一个输出dict的方法。这个类需要实例化一个文件路径。该方法需要一个字符串参数来输出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 contai

我有一个类,它有一个输出dict的方法。这个类需要实例化一个文件路径。该方法需要一个字符串参数来输出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的过程是不相关的。最终结果如下:

数据={'Key1':['String1','String2','String3',…],'Key2':[1,2,4,…]}

当我开始实现这个类时,我注意到我想让数据变成一个对象。此对象将具有方法data.printKey1和data.printKey2,这将输出以下内容:

>>> data.printKey1()
String1
String2
String3 
...
>>>data.printKey2()
1
2
4
现在我被卡住了,因为我真的不想重建生成数据的整个过程,但我需要它是一个对象

我不确定是应该使用继承,还是其他一些我不知道的构造。理论上,这里使用的最佳实践是什么?我如何生成这个新的数据类/对象而不必重写create_dict方法中包含的整个过程


谢谢

你真的需要上课吗?一个简单的函数将起作用:

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")
但这对IMHO来说几乎是无用的,至少对于给定的示例来说,它对于一些更复杂的数据模型和表示内容可能是有意义的


哦,是的,FWIW,Python函数是类函数的对象实例,所以你可以告诉一些心胸狭窄的OO纯粹主义者,基于函数的解决方案实际上是正确的OO设计太xD了,可怜的Java家伙不得不发明一种设计模式——functor——来隐藏这样一个事实,即有时你所需要的只是一个简单的旧函数……

首先,看下面的视频Python核心开发人员:-您的类不是类。之后,如果还有问题,欢迎回来。@Drako和?这是怎么回答这个问题的?@Brunodesshuilliers我希望这个问题在看到那个视频后消失,但可能会被另一个更适合解释的替代answer@Drako您发布的视频的目的是让来自Java或类似语言的人意识到他们不一定到处都需要类,并且在编写一个可能(或不可能)过分的类之前要三思。就像所有的黄金法则一样,这不是一条法则,而是一条总的指导方针。就像所有的黄金法则一样,这是一个巨大的盐粒,事实上,一旦你理解了背后的原因,就完全被忽视了-在这一点上,你是唯一一个知道什么对手头的问题有意义的人。IOW:不要做一个纯粹主义者。@Brunodesshuilliers很抱歉,只是兼职教授Python,工作起来会很困难,建议与我所教的不同——即使我知道在现实世界中,有时丑陋的解决方案在某些情况下可能是必要的——我不得不自己做很多次::你的答案与我在视频中看到的信息有些相同在重新提问之前,将其作为必填项:-当您看到包含两个方法的类时,其中一个是init-您知道-它不是类,而是方法:D@Drako这并不意味着你也不应该使用自定义类——这完全取决于上下文,没有黄金法则。