Лучшая объектно-ориентированная конструкция Python для конкретного приложения - PullRequest
0 голосов
/ 01 июня 2018

У меня есть класс с одним методом, который выводит 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генерируется, но мне нужно, чтобы он был объектом.

Я не уверен, стоит ли мне использовать наследование, сдерживание класса или состав (или какую-то другую конструкцию, которой я являюсьне в курсе).Теоретически, что является лучшей практикой для использования здесь?Как я могу сгенерировать этот новый data класс / объект без необходимости переделки всей процедуры, содержащейся в методе create_dict?

Спасибо

1 Ответ

0 голосов
/ 01 июня 2018

Тебе действительно нужен класс для этого?сработала бы простая функция:

def printkey(data, key):
    for line in data[key]:
        print(line)

printkey(data, "key1")
printkey(data, "key2")

На самом деле, смешивание логики домена с представлением - это хорошо известный антипаттерн.Если вы действительно хотите получить класс (чтобы порадовать какого-нибудь узколобого пуристика или по более веским причинам, которые не объяснены в вашем вопросе), тогда вы, конечно, можете написать какой-нибудь класс "ведущего":

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, PythonARE объекты (экземпляры класса function), так что вы можете просто сказать какому-то узколобому OO-purist, что решение на основе функций на самом деле тоже является правильным OO-дизайном xD (бедные Java-парни должны были изобрести шаблон проектирования - "functor "- чтобы скрыть тот факт, что иногда все, что вам нужно, это простая старая функция ...).

...