Re: [Python-es] Acceder a metodos inválidos

Chema Cortes pych3m4 en gmail.com
Jue Abr 16 18:53:55 CEST 2009


El día 16 de abril de 2009 15:43, Ferran Fontcuberta
<ferran en fompi.net> escribió:
> El jue, 16-04-2009 a las 14:25 +0100, heimy escribió:
>> Casi mejor que uses setattr(self, element, Felement(......))
>
> Me acostumbré a utilizar __dict__ en casos en los que tenía que bindear
> __setattr__ y __getattr__, pero, por otra parte, esto es una
> puntualización típica. Por lo que sé, se recomienda usar setattr/getattr
> en vez de __dict__ cuando la clase es herencia de object, ¿no? :?

No todos los atributos se almacenan en el diccionario del objeto
(__dict__). Además de ésto, también puede ocurrir que los atributos
sean "virtuales" (__getattribute__) o que sean descriptores
(properties). Es mejor usar siempre las dos funciones getattr/setattr
para acceder a los atributos.

Aprovechando este mecanismo, podrías hacerte tu propia función
__getattribute__, por ejemplo:

class Felement(object):
...
  def new(self, element):
    n=element.replace(":","__")
    setattr(self, n, Felement(self.__root, self.__this, element) )

  def __getattribute__(self, name):
        n=name.replace(":","__")
        return object.__getattribute__(self,n)


Se sustituye el caracter ':' por el '__'. De este modo podrías hacer
cosas como éstas:


epp.new('command')
epp.command.new('info')

epp.command.info.new('contact:info')

epp.command.info.contact__info
getattr(epp.command.info,"contact:info")
#getattr(epp.command.info,"contact__info")
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es