una poo polimorfismo otra metodo llamar instancia importar funciona definir como clases clase atributos python instance anonymous-types

poo - Crear una instancia de clase anónima en python



polimorfismo python (5)

tipo

Si bien esta no es precisamente una declaración, creo que crear una envoltura alrededor de la magia de la respuesta aceptada hace que sea mucho más fácil de leer.

import inspect # wrap the type call around a function # use kwargs to allow named function arguments def create_type(name, **kwargs): return type(name, (object,), kwargs) # example call to make a structure p = create_type(''foobar'', xxx=''barfoo'', seti=0) assert p.xxx == ''barfoo'' assert p.seti == 0 print inspect.getmembers(p)

Salida

[(''__class__'', <type ''type''>), (''__delattr__'', <slot wrapper ''__delattr__'' of ''object'' objects>), (''__dict__'', <dictproxy object at 0x9a5050>), (''__doc__'', None), (''__format__'', <method ''__format__'' of ''object'' objects>), (''__getattribute__'', <slot wrapper ''__getattribute__'' of ''object'' objects>), (''__hash__'', <slot wrapper ''__hash__'' of ''object'' objects>), (''__init__'', <slot wrapper ''__init__'' of ''object'' objects>), (''__module__'', ''__main__''), (''__new__'', <built-in method __new__ of type object at 0x399c578460>), (''__reduce__'', <method ''__reduce__'' of ''object'' objects>), (''__reduce_ex__'', <method ''__reduce_ex__'' of ''object'' objects>), (''__repr__'', <slot wrapper ''__repr__'' of ''object'' objects>), (''__setattr__'', <slot wrapper ''__setattr__'' of ''object'' objects>), (''__sizeof__'', <method ''__sizeof__'' of ''object'' objects>), (''__str__'', <slot wrapper ''__str__'' of ''object'' objects>), (''__subclasshook__'', <built-in method __subclasshook__ of type object at 0x919370>), (''__weakref__'', <attribute ''__weakref__'' of ''foobar'' objects>), # here they are (''seti'', 0), (''xxx'', ''barfoo'')]

nombrado doble

from collections import namedtuple d = { ''a'' : ''foo'', ''b'' : ''bar'' } foobar = namedtuple(''foobar'', d.keys())(**d) print foobar

Salida

Python 2.7.5 (default, May 30 2013, 16:55:57) [GCC] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from collections import namedtuple >>> d = { ''a'' : ''foo'', ''b'' : ''bar'' } >>> foobar = namedtuple(''foobar'', d.keys())(**d) >>> print foobar foobar(a=''foo'', b=''bar'') >>>

A veces necesito crear una instancia de clase anónima en Python, como c #:

var o= new {attr1="somehing", attr2=344};

Pero en Python lo hago de esta manera:

class Dummy: pass o = Dummy() o.attr1 = ''something'' o.attr2 = 344 #EDIT 1 print o.attr1, o.attr2

¿Cómo se puede hacer eso de manera pitónica en una sola declaración?


Prefiero la respuesta del dictamen de mwhite, pero así es como lo he hecho en el pasado usando la "magia" de los kwargs (juego de palabras destinado).

class ObjectFromDict(object): def __init__(**kwargs): for k in kwargs: if k not in self.__dict__: setattr(k,v) myObj = ObjectFromDict(**{''foo'': ''bar'', ''baz'': ''monkey''}) print myObj.foo #bar


Si está usando Python 3.3 o posterior, puede usar types.SimpleNamespace . types.SimpleNamespace :

from types import SimpleNamespace o = SimpleNamespace(attr1="something", attr2=344) print(o) # namespace(attr1=''something'', attr2=344)


class attrdict(dict): def __getattr__(self, key): return self[key] o = attrdict(attr1=''something'', attr2=344) o.attr1

Pero parece que probablemente deberías usar un dictado estándar.


o = type(''Dummy'', (object,), { "attr1": "somehing", "attr2": 344 })

o.attr3 = "test" print o.attr1, o.attr2, o.attr3