ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python – 如何定义不受__getattr__影响的属性?

2019-07-10 00:59:22  阅读:214  来源: 互联网

标签:python xml ironpython getattr


我对Python很新.在最近编程很多PHP时,我习惯了一些创造性地使用__get和__set“魔术”方法.这些只在该类的公共变量不存在时才被调用.

我试图在Python中复制相同的行为,但似乎失败了.鉴于似乎没有办法以C / PHP方式实际定义类变量,当我尝试在我的类中通常使用变量时(即通过self),它最终调用__getattr__!

如何定义我不希望受__getattr__影响的类的属性?

我正在尝试做的一些示例代码如下,我想要self.Document和self.Filename不要调用__getattr__.

谢谢您的帮助!

class ApplicationSettings(object):
    RootXml = '<?xml version="1.0"?><Settings></Settings>'

    def __init__(self):
        self.Document = XmlDocument()
        self.Document.LoadXml(RootXml)

    def Load(self, filename):
        self.Filename = filename
        self.Document.Load(filename)

    def Save(self, **kwargs):
        # Check if the filename property is present
        if 'filename' in kwargs:
            self.Filename = kwargs['filename']

        self.Document.Save(self.Filename)

    def __getattr__(self, attr):
        return self.Document.Item['Settings'][attr].InnerText

    def __setattr__(self, attr, value):
        if attr in self.Document.Item['Settings']:
            # If the setting is already in the XML tree then simply change its value
            self.Document.Item['Settings'][attr].InnerText = value
        else:
            # Setting is not in the XML tree, create a new element and add it
            element = self.Document.CreateElement(attr)
            element.InnerText = value

            self.Document.Item['Settings'].AppendChild(element)

解决方法:

只有当Python无法在实例本身或其任何基类中找到该属性时,才会调用__getattr__.简单的解决方案是将Document和Filename添加到类中,以便找到它.

class ApplicationSettings(object):
    Document = None
    Filename = None
    RootXml = '<?xml version="1.0"?><Settings></Settings>'
    ...

标签:python,xml,ironpython,getattr
来源: https://codeday.me/bug/20190710/1418657.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有