如何重写以下示例以正确使用@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
答案 0 :(得分:2)
对于初学者来说,您不能使用属性传递多个值,因此set_config
不能是当前构造的属性。
此外,值得指出的是,get_config
和set_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
。