如何正确使用@property

时间:2018-10-10 16:50:16

标签: python properties

如何重写以下示例以正确使用@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 :(得分:2)

对于初学者来说,您不能使用属性传递多个值,因此set_config不能是当前构造的属性。

此外,值得指出的是,get_configset_config并不完全匹配,从逻辑上讲-get_config为您提供文件的内容,而set_config仅设置路径名,而不设置内容。这种类型的不对称会导致令人困惑的错误。

如果要将此属性设置为两个属性,则可能需要做两件事:一个是获取/设置磁盘存储路径(如果操作很重要),另一个是获取/设置磁盘存储路径。当前配置路径的数据内容。

答案 1 :(得分:1)

只需将配置文件路径的定义移至构造函数中即可:

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