让我感到惊讶的是,这段代码会产生以下错误(Python 2.7.3):
class Foo(object):
class Bar(object):
pass
class Baz(object):
class InnerBar(Bar):
pass
导致结果:
Enthought Python Distribution -- www.enthought.com
Version: 7.3-2 (64-bit)
Python 2.7.3 |EPD 7.3-2 (64-bit)| (default, Apr 11 2012, 17:52:16)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "credits", "demo" or "enthought" for more information.
Hello
>>> class Foo(object):
... class Bar(object):
... pass
... class Baz(object):
... class InnerBar(Bar):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in Foo
File "<stdin>", line 5, in Baz
NameError: name 'Bar' is not defined
我的怀疑是这与等价的Bar = type(...)
class
赋值的特定执行有关,但即便如此,为什么Bar
不能在Baz
内部通过闭包得到呢?
有没有办法解决这个精确实现的问题(也就是说,我不想放宽Bar
是在Foo
内定义的普通class
的限制,而且其他嵌套在Foo
中的类可能也想从Bar
继承)。
我考虑的具体用例是模拟一些数据库结构,以实现更符合面向对象设计的方案,以反映数据服务项目中的模式。大部分代码都是由针对XSD执行检查的程序生成的Python代码,所以在类中定义其他类是模拟XSD复杂类型的某些方式的自然方法,但同时还能够表明它们何时是其他复杂类型的子级等。这就是我不愿意将类拉出Foo
供后续继承的原因。
Foo
正在进行的本地命名空间中对Bar
和Baz
没有完全发生。在Foo
成为绑定名称之前正在为Foo
开发的任何本地名称空间中,为什么不会完成所有Bar
的套件,然后将Bar
绑定到该命名空间中,然后执行所有Baz
的套件(包括InnerBar
,它可以查找一个命名空间级别以找到Bar
,因为Bar
将已经绑定在该命名空间中),然后Foo
完成并绑定?我错过了什么吗? - elyFoo
内部使用了Foo
。我看错了。不,类命名空间并不是查找其他名称的作用域。无法找到Bar
,因为Foo
套件不是父级作用域。 - Martijn Pieters