• [^] # Re: Monkey patching ?

    Posté par . 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.

    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)


    Merci pour tout.