Alors, j'ai essayé en rajoutant les méthodes de MyNode à Element:
mynode = MyNode()
for attribute in dir(mynode):
if attribute.startswith('_'):
continue
setattr(node, attribute, getattr(mynode, attribute))
Mais j'obtiens cette erreur (alors que ça fonctionnait avec deux classes bidons lors de tests): File svgnode.py, line 47, in convertToMyNode
setattr(node, attribute, getattr(mynode, attribute))
AttributeError: 'lxml.etree._Element' object has no attribute 'checkNamespace'
J'ai essaye avec ta technique, mais j'obtiens une boucle infini sur le setattr quand dans le __init__ on fait le: self._node = node
Finalement, ça fonctionne en faisant: def __init__(self, node):
self._node = node
def __getattr__(self, name):
if name in self.__dict__:
return self.__dict__[name]
elif '_node' in self.__dict__:
return getattr(self._node, name)
else:
return None
def __setattr__(self, name, value):
if name not in self.__dict__:
self.__dict__[name] = value
else:
if hasattr(self._node, name):
setattr(self._node, name, value)
else:
setattr(self, name, value)
[^] # Re: Monkey patching ?
Posté par bios_qui_rote . En réponse au message Instancier un classe dérivée à partir d'une instance de la classe de base déjà instanciée.. Évalué à 1.
mynode = MyNode()
for attribute in dir(mynode):
if attribute.startswith('_'):
continue
setattr(node, attribute, getattr(mynode, attribute))
Mais j'obtiens cette erreur (alors que ça fonctionnait avec deux classes bidons lors de tests):
File svgnode.py, line 47, in convertToMyNode
setattr(node, attribute, getattr(mynode, attribute))
AttributeError: 'lxml.etree._Element' object has no attribute 'checkNamespace'
J'ai essaye avec ta technique, mais j'obtiens une boucle infini sur le setattr quand dans le __init__ on fait le:
self._node = node
Finalement, ça fonctionne en faisant:
def __init__(self, node):
self._node = node
def __getattr__(self, name):
if name in self.__dict__:
return self.__dict__[name]
elif '_node' in self.__dict__:
return getattr(self._node, name)
else:
return None
def __setattr__(self, name, value):
if name not in self.__dict__:
self.__dict__[name] = value
else:
if hasattr(self._node, name):
setattr(self._node, name, value)
else:
setattr(self, name, value)
Merci pour tout.