在Python 2.6中,也是自定义描述符的类装饰器匹配您提供的规范:
class InnerClassDescriptor(object):
def __init__(self, cls):
self.cls = cls
def __get__(self, instance, outerclass):
class Wrapper(self.cls):
outer = instance
Wrapper.__name__ = self.cls.__name__
return Wrapper
class Outer(object):
@InnerClassDescriptor
class Inner(object):
def __init__(self):
print self.outer
o = Outer()
i = o.Inner()
print 'Outer is a', type(Outer)
print 'Inner is a', type(o.Inner)
这发出:
<__main__.Outer object at 0x82f90>
Outer is a <type 'type'>
Inner is a <type 'type'>
只是为了确认
o.Inner [[is]]是一个类对象,而不是像闭包那样奇怪的东西
根据您的特殊规格。当然,每次重入都需要使用 不同的 类-即使在单线程环境中,以下内容也是如此:
o1 = Outer()
o2 = Outer()
i1 = o1.Inner
i2 = o2.Inner
print i1(), i2(), i1(), i2()
应该可以正常工作,并且将o1 vs o2存放在o1.Inner
比vs返回的类之外的其他任何地方o2.Inner
(例如,在TLS中)将意味着这种用法的可怕结果。
但你 并没有 注明“o.Inner
必须是 的同一类对象 的每个 可能o
这就是实例Outer
”,所以这段代码完全满足您的规格 没有 给予;-)。