如果 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