Как получить и установить атрибут с аргументами - PullRequest
0 голосов
/ 18 марта 2020

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

class C:

    def __init__(self):
        self.zip_files_at_loc_ = None
        self.default_path = '~/default'

    @property
    def zip_files_at_loc(self):
        if self.zip_files_at_loc_ is None:
           self.zip_files_at_loc_ = glob.glob(self.default_path+"/*.zip")
        return self.zip_files_at_loc_

Это не делает две новые функции, которые я хотел бы. Я мог бы избавиться от атрибута и просто заменить его следующей функцией:

def get_zips(self, path=None):
    if not path:
        path = self.default_path
    return glob.glob(path+"/*.zip")

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

1 Ответ

0 голосов
/ 18 марта 2020

Добавьте метод reset(), который устанавливает self.zip_files_at_loc_ обратно на None, чтобы при следующем вызове был произведен пересчет.

И сделать каталог параметром класса. Чтобы изменить каталоги, просто используйте разные C объекты для каждого. Или переназначить c.default_path(), а затем вызвать c.reset().

class C:

    def __init__(self, default_path = '~/default'):
        self.zip_files_at_loc_ = None
        self.default_path = default_path

    @property
    def zip_files_at_loc(self):
        if self.zip_files_at_loc_ is None:
           self.zip_files_at_loc_ = glob.glob(self.default_path+"/*.zip")
        return self.zip_files_at_loc_

    def reset(self):
        self.zip_files_at_loc_ = None

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