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