multiple method init__ herency comando __init__ python super

method - super class self__ init__ python



Usando super() en clases anidadas (3)

Como B probablemente nunca se extenderá, esto debería funcionar:

class A(object): class B(object): def __init__(self): super(self.__class__, self).__init__()

Imagina esto:

class A(object): class B(object): def __init__(self): super(B, self).__init__()

Esto crea un error:

NameError: global name B is not defined.

He intentado AB , pero luego dice que A no está definido.

Actualizar:

He encontrado el problema.

He tenido una clase como esta:

class A(object): class B(object): def __init__(self): super(B, self).__init__() someattribute = B()

En ese ámbito, A no está definido aún.


No estoy seguro de por qué AB no está funcionando correctamente para usted, como debería ... Aquí hay algunos resultados de shell que funcionan:

>>> class A(object): ... class B(object): ... def __init__(self): ... super(A.B, self).__init__() ... def getB(self): ... return A.B() ... >>> A().getB() <__main__.B object at 0x100496410>


Si es poco probable que la clase AB participe en alguna herencia múltiple, entonces es mejor que simplemente codifique la llamada del constructor:

class A(object): class B(object): def __init__(self): object.__init__(self)

Pero si realmente necesitas tener todo el poder de super, entonces puedes obtener lo que deseas definiendo un descriptor personalizado que inicialice el atributo B perezosamente:

class LazyAttribute(object): def __init__(self, func, *args, **kwargs): self._func = func self._args = args self._kwargs = kwargs self._value = None def __get__(self, obj, type=None): if self._value is None: print ''created'', self._value self._value = self._func(*self._args, **self._kwargs) return self._value class A(object): class B(object): def __init__(self): super(A.B, self).__init__() someattribute = LazyAttribute(B)

Esto hará que el atributo B se cree una instancia la primera vez que se acceda, y luego se reutilizará:

>>> print A.someattribute created <__main__.B object at 0x00AA8E70> <__main__.B object at 0x00AA8E90> >>> print A().someattribute <__main__.B object at 0x00AA8E90>

Para obtener más información sobre los descriptores, consulte: http://users.rcn.com/python/download/Descriptor.htm