Я довольно новичок в Python.В последнее время в программировании на PHP я привык к творческому использованию «магических» методов __get
и __set
.Они вызывались только тогда, когда общедоступная переменная класса отсутствовала.
Я пытаюсь повторить то же поведение в Python, но, похоже, терпит неудачу.Поскольку, похоже, не существует способа на самом деле определить переменные класса способом C ++ / PHP, когда я пытаюсь использовать переменные внутри своего класса (то есть через себя), он вызывает __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)