我正在模仿ConfigParser模块的行为来编写一个高度专业化的解析器,它利用我使用的特定应用程序的配置文件中的一些定义良好的结构.这些文件遵循标准的INI结构:
[SectionA]
key1=value1
key2=value2
[SectionB]
key3=value3
key4=value4
Run Code Online (Sandbox Code Playgroud)
对于我的申请,这些部分基本上无关紧要; 来自不同部分的密钥之间没有重叠,并且所有用户只记住密钥名称,而不是他们应该进入哪个部分.因此,我想覆盖__getattr__并且__setattr__在MyParser我创建的类中允许快捷方式像这样:
config = MyParser('myfile.cfg')
config.key2 = 'foo'
Run Code Online (Sandbox Code Playgroud)
该__setattr__方法首先尝试查找一个被调用的部分key2,并将其设置为'foo'(如果存在).假设没有这样的部分,它会在每个部分内部查找一个名为的密钥key2.如果密钥存在,则将其设置为新值.如果它不存在,解析器最终会引发一个AttributeError.
我已经构建了一个测试实现,但问题是我还想要一些免除这种行为的直接属性.我想config.filename成为一个包含原始文件名称的简单字符串,并且config.content是包含每个部分的字典的字典.
是否有一种干净的方法来在构造函数中设置filename和content属性,以避免被我的自定义getter和setter忽略?__dict__在调用自定义之前,python是否会在对象中查找属性__setattr__?
通filename,content超类来处理它
class MyParser(object):
def __setattr__(self, k, v):
if k in ['filename', 'content']:
super(MyParser, self).__setattr__(k, v)
else:
# mydict.update(mynewattr) # dict handles other attrs
Run Code Online (Sandbox Code Playgroud)