クラス AB が多重継承に参加する可能性が低い場合は、コンストラクター呼び出しをハードコーディングする方がよいでしょう。
class A(object):
class B(object):
def __init__(self):
object.__init__(self)
しかし、本当に super の全機能が必要な場合は、B 属性を遅延して初期化するカスタム記述子を定義することで、必要なものを得ることができます。
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)
これにより、 B 属性が最初にアクセスされたときにインスタンス化され、その後再利用されます。
>>> print A.someattribute
created <__main__.B object at 0x00AA8E70>
<__main__.B object at 0x00AA8E90>
>>> print A().someattribute
<__main__.B object at 0x00AA8E90>
記述子の詳細については、http: //users.rcn.com/python/download/Descriptor.htmを参照してください。