我正在模仿ConfigParser
模块的行为,编写一个高度专业化的解析器,利用特定应用程序配置文件中一些明确定义的结构。这些文件遵循标准的INI结构:
[SectionA]
key1=value1
key2=value2
[SectionB]
key3=value3
key4=value4
对于我的应用程序,各个部分基本上是不相关的;不同部分的键之间没有重叠,所有用户只记得键名,从来不知道它们应该放在哪个部分。因此,我想在我创建的MyParser
类中覆盖__getattr__
和__setattr__
,以允许像这样的快捷方式:
config = MyParser('myfile.cfg')
config.key2 = 'foo'
__setattr__
方法首先尝试查找名为 key2
的部分并将其设置为 'foo'(如果存在)。假设没有这样的部分,则会在每个部分内查找名为 key2
的键。如果该键存在,则将其设置为新值。如果不存在,则解析器最终会引发 AttributeError
。我已经构建了一个测试实现,但问题是我还想让一些纯属性免于此行为。我希望
config.filename
是一个简单的字符串,包含原始文件的名称,并且 config.content
是保存每个部分字典的字典。有没有一种干净的方法在构造函数中设置
filename
和 content
属性,使它们避免被我的自定义 getter 和 setter 忽略?Python 会在调用自定义的 __setattr__
之前在对象的 __dict__
中查找属性吗?
__setattr__
方法中维护这些“特殊”属性的想法。看起来我可以在构造函数中使用你的super
构造定义它们,之后获取它们就可以正常工作了;print config.filename
会得到正确的结果。然而,设置属性却行不通,因为它会降入自定义的__setattr__
并最终抛出错误。为什么Python在获取时捕获属性,但在设置时却没有呢? - Jeff Klukas__setattr__
中定义它们,那么您可以定义一个类属性(例如MyParser.specials
而不是文字列表),但代码的流程是相同的。至于为什么获取操作有效,那不就是因为这些示例中没有定义__getattr__
吗? - Cartroo__getattr__
逻辑,其中return
语句结束了代码执行,而在__setattr__
中,这些return
语句现在设置变量而不会结束执行。所以我感知到的差异是我的错误,而不是基本的Python行为。 - Jeff Klukas