我可以部分覆盖__setattr__吗?

时间:2013-01-10 17:52:23

标签: python

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 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