Функция Python - это просто объект, который может получать дополнительные атрибуты.К сожалению, свойства не могут, поэтому вы должны развернуть их.Это означает, что вы можете начать с:
def OutputAsXmlElement(label, schema):
def deco(p):
f = p.fget if isinstance(p, property) else p
f._label = label
f._schema = schema
f._iselement = True
return p
return deco
def OutputAsXmlAttribute(label, schema):
def deco(p):
f = p.fget if isinstance(p, property) else p
f._label = label
f._schema = schema
f._iselement = False
return p
return deco
Затем через модуль inspect
вы можете получить доступ к этим специальным атрибутам.Например, вот способ найти всех украшенных членов вашего примера класса с их меткой и схемой:
for x, y in ((x,y) for x,y in inspect.getmembers(xmlInvoice.__class__)
if not x.startswith('__')):
if isinstance(y, property):
f = y.fget
else:
f = y
print(x, getattr(f, '_label', None), getattr(f, '_schema', None), getattr(f, '_element', None))