Как правильно использовать @property - PullRequest
0 голосов
/ 10 октября 2018

Как переписать следующий пример, чтобы правильно использовать @property?

class Config:
    def __init__(self, config_folder="", config_file="config.json"):
        self.set_config(config_folder, config_file)

    def get_config(self):
        with open(self.config) as f:
            return json.load(f)

    def set_config(self, config_folder, config_file):
        self.BASE_DIR = pathlib.Path(__file__).parent
        self.config = self.BASE_DIR / config_folder / config_file

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Для начала, вы не можете передавать несколько значений, используя свойство, поэтому ваш set_config не может быть свойством, созданным в данный момент.

Кроме того, стоит указать, что ваши get_config иset_config на самом деле не соответствует, логически - get_config дает вам содержимое файла, в то время как set_config, вместо установки содержимого, просто задает имя пути.Этот тип асимметрии может привести к сбивающим с толку ошибкам.

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

0 голосов
/ 10 октября 2018

Просто переместите определения пути файла конфигурации в конструктор:

class Config:
    def __init__(self, config_folder="", config_file="config.json"):
        self.base_dir = pathlib.Path(__file__).parent
        self.config_path = self.base_dir / config_folder / config_file

    @property
    def config(self):
        with open(self.config_path) as f:
            return json.load(f)

Если вы хотите перезаписать путь конфигурации позже, вы можете сделать это, изменив атрибут напрямую (обратите внимание, чтоэто атрибут config_path, а не атрибут config):

conf = Config()
conf.config_path = "./other_config.json"
print(conf.config)

В качестве альтернативы вы можете использовать такой метод, как ваш set_config (вероятно, лучше названный set_config_path), чтобы иметь дело с base_dir.

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