Лучшая объектно-ориентированная конструкция Python для использования в конкретном приложении

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

Я не уверен, следует ли мне использовать наследование, включение класса или < href="https://stackoverflow.com/questions/49528586/redefining-a-subclass-sort-of-structure-using-inheritance">composition (или какая-то другая конструкция, о которой я не знаю). Теоретически, что лучше всего использовать здесь? Как я могу сгенерировать этот новый класс/объект data без необходимости переделывать всю процедуру, содержащуюся в методе create_dict?

Спасибо


person user32882    schedule 01.06.2018    source источник
comment
сначала — посмотрите это видео (от основного разработчика Python): youtube.com/watch?v=o9pEzgHorH0 - ваш класс не является классом. Потом, если будут еще вопросы - добро пожаловать.   -  person Drako    schedule 01.06.2018
comment
@ Драко и ? Как это должно ответить на вопрос?   -  person bruno desthuilliers    schedule 01.06.2018
comment
@brunodesthuilliers Я ожидал, что вопрос исчезнет после просмотра этого видео, но может быть заменен другим, более подходящим для поясняющего ответа.   -  person Drako    schedule 01.06.2018
comment
@Drako смысл видео, которое вы разместили, состоит в том, чтобы заставить людей, пришедших с Java или подобных языков, понять, что им обязательно не нужны классы повсюду, и дважды подумать, прежде чем писать класс, который может быть или не быть излишним . Как и все золотые правила, это не правило, это общая рекомендация. Как и ко всем золотым правилам, это следует воспринимать с (огромной) долей скептицизма и на самом деле полностью игнорировать, как только вы поймете причины — на данный момент вы единственный, кто знает, что имеет смысл для проблемы на рука. IOW: не будь пуристом.   -  person bruno desthuilliers    schedule 01.06.2018
comment
@brunodesthuilliers извините, я также преподаю Python на полставки, и было бы трудно работать и давать советы, отличные от того, чему я учу - даже я знаю, что в реальном мире иногда в определенных случаях может потребоваться уродливое решение - приходилось делать это много раз самому :)   -  person Drako    schedule 01.06.2018
comment
@Драко, почему уродливый? Чем декоратор на основе классов (по сути, «класс с инициализацией и одним методом») уродливее декоратора на основе замыкания? Вы когда-нибудь смотрели на реализацию типа Method? (подсказка: в основном другой «класс с инициализацией и одним методом»). Извините, но вы все еще догматичны.   -  person bruno desthuilliers    schedule 01.06.2018


Ответы (1)


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

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")

но это действительно в основном бесполезно IMHO, по крайней мере, для данного примера (это может иметь смысл для некоторых гораздо более сложных моделей данных и презентаций).

О, и да, FWIW, функции Python ЯВЛЯЮТСЯ объектами (экземплярами класса function), так что вы можете просто сказать какому-нибудь узколобому-OO-пуристу, что решение, основанное на функциях, на самом деле является правильным OO-дизайном xD (бедным чувакам Java пришлось изобретать шаблон проектирования - "функтор" - чтобы скрыть тот факт, что иногда все, что вам нужно, это простая старая функция...).

person bruno desthuilliers    schedule 01.06.2018
comment
:) ваш ответ в чем-то совпадает с информацией в этом видео, которую я указал как обязательную перед повторным вопросом :) - когда вы видите класс с двумя методами, один из них init - вы знаете - это не класс, это метод :D - person Drako; 01.06.2018
comment
@Drako, это не означает, что вы также не должны использовать собственный класс - все зависит от контекста, золотого правила НЕТ. - person bruno desthuilliers; 01.06.2018