想象一下:
class A(object):
class B(object):
def __init__(self):
super(B, self).__init__()
这会产生错误:
NameError: global name B is not defined.
我已尝试过A.B
,但后来却说A
未定义。
更新
我发现了问题。
我有一个这样的课程:
class A(object):
class B(object):
def __init__(self):
super(B, self).__init__()
someattribute = B()
在该范围内,A尚未定义。
答案 0 :(得分:18)
我不确定为什么A.B不适合你,因为它应该..这里有一些shell输出有效:
>>> 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>
答案 1 :(得分:5)
由于B本身可能永远不会扩展,所以这应该有效:
class A(object):
class B(object):
def __init__(self):
super(self.__class__, self).__init__()
答案 2 :(得分:2)
如果A.B类不太可能参与任何多重继承,那么你最好只是对构造函数调用进行硬编码:
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