5

我正在模仿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成为包含每个部分的字典的字典。

是否有一种干净的方法可以在构造函数中设置filenameandcontent属性,以免它们被我的自定义 getter 和 setter 忽略?__dict__在调用 custom 之前,python 会在对象中查找属性__setattr__吗?

4

2 回答 2

7

传给超filenamecontent来处理

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
于 2013-01-10T18:00:39.933 回答
2

我认为为文件的内容提供一个类似字典的界面并为内部目的保留属性访问可能会更简洁。然而,这只是我的意见。

为了回答你的问题,__setattr__()在 check in 之前调用__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
于 2013-01-10T18:01:24.190 回答