我正在模仿ConfigParser
模块的行为来编写一个高度专业化的解析器,该解析器利用我使用的特定应用程序的配置文件中的一些定义良好的结构。这些文件遵循标准的INI结构:
[SectionA]
key1=value1
key2=value2
[SectionB]
key3=value3
key4=value4
对于我的申请,这些部分基本上无关紧要;来自不同部分的密钥之间没有重叠,并且所有用户只记住密钥名称,从不记得他们应该进入哪个部分。因此,我想覆盖__getattr__
和__setattr__
在我创建的MyParser
类中,允许这样的快捷方式:
config = MyParser('myfile.cfg')
config.key2 = 'foo'
__setattr__
方法首先尝试查找名为key2
的部分,并将其设置为'foo'(如果存在)。假设没有这样的部分,它会在每个部分内部查找名为key2
的密钥。如果密钥存在,则将其设置为新值。如果它不存在,解析器最终会引发AttributeError
。
我已经构建了一个测试实现,但问题是我还想要一些免除这种行为的直接属性。我希望config.filename
是一个包含原始文件名称的简单字符串,config.content
是包含每个部分字典的字典。
是否有一种干净的方法可以在构造函数中设置filename
和content
属性,以避免被我的自定义getter和setter忽略?在调用自定义__dict__
之前,python是否会在对象的__setattr__
中查找属性?
答案 0 :(得分:5)
将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
答案 1 :(得分:2)
我认为为文件内容提供类似字典的界面并为内部目的保留属性访问可能更清晰。但是,这只是我的意见。
要回答您的问题,请在登入__setattr__()
之前调用__dict__
,以便您可以按照以下方式实施:
class MyParser(object):
specials = ("filename", "content")
def __setattr__(self, attr, value):
if attr in MyParser.specials:
self.__dict__[attr] = value
else:
# Implement your special behaviour here