Являются ли подробные методы __init__ в Python плохими? - PullRequest
6 голосов
/ 12 марта 2012

У меня есть программа, которую я пишу на Python, которая выполняет следующие действия:

Пользователь вводит имя папки. Внутри этой папки 8-15 файлов .dat с различными расширениями.

Программа открывает эти файлы данных, вводит их в базу данных SQL, а затем позволяет пользователю выбирать различные изменения, внесенные в базу данных. Затем база данных экспортируется обратно в файлы .dat. Можно выполнить около 5-10 различных операций.

Я планировал спроектировать это так, чтобы создать стандартный класс для каждой группы файлов. Пользователь вводит имя папки, и создается объект с определенными атрибутами (имена файлов, словарь файлов, версия файлов (есть разные версии) и т. Д.). Определение этих атрибутов требует открытия нескольких из этих файлов, чтения имен файлов и т. Д.

Должно ли это действие выполняться методом __init__? Или это действие следует переносить на другие методы экземпляра, которые вызываются в методе __init__? Или эти методы должны быть где-то еще и вызываться только тогда, когда атрибут требуется в другом месте программы?

Я уже написал эту программу на Java. И у меня был конструктор, который вызывал другие методы в классе для установки атрибутов объекта. Но мне было интересно, какой будет стандартная практика в Python.

Ответы [ 4 ]

3 голосов
/ 12 марта 2012

Что ж, в Python нет ничего особенного в хороших ООП-практиках.Разложение одного большого метода на кучу маленьких - отличная идея как в Java, так и в Python.Помимо прочего, небольшие методы дают вам возможность писать различные конструкторы:

class GroupDescriptor(object):
    def __init__(self, file_dictionary):
        self.file_dict = file_dictionary
        self.load_something(self.file_dict['file_with_some_info'])

    @classmethod
    def from_filelist(cls, list_of_files):
        file_dict = cls.get_file_dict(list_of_files)
        return cls(file_dict)

    @classmethod
    def from_dirpath(cls, directory_path):
        files = self.list_dir(directory_path)
        return cls.from_filelist(files)

Кроме того, я не знаю, как это в Java, но в Python вам не нужно беспокоиться об исключениях в конструкторе, потому чтоони прекрасно обрабатываются.Поэтому работать с такими склонными к исключениям вещами, как файлы, вполне нормально.

1 голос
/ 12 марта 2012

Метод __init__ вызывается при создании экземпляра объекта.

Исходя из фона C ++, я считаю, что нехорошо выполнять реальную работу, кроме инициализации в конструкторе.

1 голос
/ 12 марта 2012

Нет проблем с длинным __init__ методом, но я бы избежал его просто потому, что его сложнее тестировать. Мой подход заключается в создании меньших методов, которые вызываются из __init__. Таким образом, вы можете проверить их и инициализацию отдельно.

Должны ли они быть вызваны в случае необходимости или заблаговременно, зависит от того, что вам нужно от них делать. Если они являются дорогостоящими операциями и, как правило, не все необходимы, то, возможно, лучше вызывать их только при необходимости. С другой стороны, возможно, вы захотите запустить их заранее, чтобы не было задержки, когда требуются атрибуты.

Из твоего вопроса не ясно, нужен ли тебе класс. У меня нет опыта работы с Java, но я понимаю, что все в нем является классом. В python вполне приемлемо просто иметь функцию, если это все, что требуется, и создавать классы только тогда, когда вам нужны экземпляры и другие классные вещи.

1 голос
/ 12 марта 2012

Похоже, что действие, которое вы описываете , является инициализацией, так что было бы совершенно нормально поместить их в __init__. С другой стороны, эти действия кажутся довольно дорогими и, вероятно, полезными в другой части программы, поэтому вы можете захотеть заключить их в какую-то отдельную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...