Использование внешней функции / переменной и внутреннего метода / атрибута - PullRequest
1 голос
/ 13 июля 2020

Я задумываюсь над этим вопросом некоторое время, но до сих пор не уверен в правильном ответе. Если где-то уже есть хороший ответ, извините за это.

Когда лучше использовать функцию или переменную, определенную где-то в модуле внутри класса, вместо того, чтобы определять ее внутри как метод / атрибут?

Пример:

PATH_TO_DIR = "abc\\def"

class Reader:
    def __init__(self, file_name):
        self.file_name = file_name

    def read_file(self):
        return pd.read_excel(os.path.join(PATH_TO_DIR, self.file_name))

или

class Reader:
    PATH_TO_DIR = "abc\\def"

    def __init__(self, file_name):
        self.file_name = file_name

    def read_file(self):
        return pd.read_excel(os.path.join(self.PATH_TO_DIR, self.file_name))

Та же проблема беспокоит меня в отношении функции / метода, например, мы могли бы определить функцию read_file () и использовать ее внутри класса извне.

Мне кажется, что определение его как метода / атрибута имеет больше смысла, но я видел много кодов, в которых эти части определялись извне. программирования python - я знаю, что язык умеет обрабатывать много странных вещей, но это не так;)

Ответы [ 2 ]

1 голос
/ 13 июля 2020

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

Лично я избегаю определения переменных внутри классов и функций.

1 голос
/ 13 июля 2020

Я бы предпочел вариант 3: передать правильный абсолютный путь к Reader.__init__. Задача Reader, по-видимому, состоит в том, чтобы проанализировать файл, не беспокоясь о структуре файловой системы.

PATH_TO_DIR = "abc\\def"

class Reader:
    def __init__(self, file_name):
        self.file_name = file_name

    def read_file(self):
        return pd.read_excel(self.file_name)


r = Reader(os.path.join(PATH_TO_DIR, "foo.xl"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...