Python 可以从嵌套类定义实现继承吗?
这段代码给出了随后的错误(Python 2.7.3),这让我感到惊讶: 结果:Python 可以从嵌套类定义实现继承吗?,python,class,inheritance,scope,Python,Class,Inheritance,Scope,这段代码给出了随后的错误(Python 2.7.3),这让我感到惊讶: 结果: 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", "
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
enthund Python发行版——www.enthund.com
版本:7.3-2(64位)
Python 2.7.3 | EPD 7.3-2(64位)|(默认值,2012年4月11日,17:52:16)
linux2上的[GCC 4.1.2 20080704(Red Hat 4.1.2-44)]
键入“学分”、“演示”或“热情思考”以了解更多信息。
你好
>>>类Foo(对象):
... 类栏(对象):
... 通过
... 类别Baz(对象):
... 类InnerBar(Bar):
... 通过
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第4行,在Foo中
文件“”,第5行,在Baz中
NameError:未定义名称“Bar”
我怀疑这与等价的Bar=type(…)
class
赋值的特定执行有关,但即便如此,为什么Bar
在Baz
中不能通过闭包实现呢
对于这种精确的实现,有没有办法解决这个问题(例如,我不想放松约束,Bar
是Foo
中定义的普通类,而Foo
中的类中的其他类可能希望从Bar
继承)
我想到的一个特殊用例是模仿一些数据库结构,以进行更面向对象的设计,以反映数据服务项目中的模式。大部分代码是自动生成的Python,源于对XSD执行检查的程序,因此在类中定义类是模拟cer的自然方式有些关于XSD复杂类型的事情,但是还可以说它们是其他复杂类型的子类,等等。这就是为什么我不愿意将类拉到Foo
之外以便以后继承的原因。这里没有闭包。当执行嵌套代码时,类的主体不是父范围
就嵌套作用域中的代码而言,只有全局作用域和局部作用域存在,Foo
类主体是而不是可以访问的命名空间
见:
如果定义出现在功能块中,则范围将扩展到定义块中包含的任何块,除非包含的块为名称引入了不同的绑定。类块中定义的名称范围仅限于类块
我的
这里的工作是使用嵌套函数生成可访问的范围:
class Foo(object):
def produce_nested_scope():
class Bar(object):
pass
class Baz(object):
class InnerBar(Bar):
pass
return Bar, Baz
Bar, Baz = produce_nested_scope()
del produce_nested_scope
演示:
>>类Foo(对象):
…def product_嵌套_scope():
…类栏(对象):
…通过
…类Baz(对象):
…类内部条(条):
…通过
…回程吧,巴兹
…Bar,Baz=product_嵌套_scope()
…删除生成嵌套范围
...
>>>富吧
>>>福巴兹
这里有一个可怕的黑客攻击:
class Foo(object):
def hack(dest):
class Bar(object):
pass
class Baz(object):
class InnerBar(Bar):
pass
dest.update(locals())
hack(locals())
>>Foo.Bar
>>>Foo.Baz.InnerBar
我仍然非常不确定为什么Bar
和Baz
在本地名称空间中没有完全发生文档化的过程,在本地名称空间中,Foo
正在执行套件。在任何本地名称中,Foo
之前的Foo
是一个绑定名称,在该名称空间中,why将不会完成所有的Bar
套件,然后Bar
绑定到该命名空间中,然后执行所有Baz
套件(包括InnerBar
,它可以查找一个命名空间级别以查找Bar
,因为Bar
将绑定到该命名空间中),然后Foo
完成并绑定?我缺少什么?@EMS:啊,我今天缺少咖啡因。我以为你在Foo
中使用Foo
。我读错了。不,类名称空间不是用于查找其他名称的作用域。Bar
无法找到,因为Foo
套件不是父作用域。
>>> class Foo(object):
... def produce_nested_scope():
... class Bar(object):
... pass
... class Baz(object):
... class InnerBar(Bar):
... pass
... return Bar, Baz
... Bar, Baz = produce_nested_scope()
... del produce_nested_scope
...
>>> Foo.Bar
<class '__main__.Bar'>
>>> Foo.Baz
<class '__main__.Baz'>
class Foo(object):
def hack(dest):
class Bar(object):
pass
class Baz(object):
class InnerBar(Bar):
pass
dest.update(locals())
hack(locals())
>>> Foo.Bar
<class '__main__.Bar'>
>>> Foo.Baz.InnerBar
<class '__main__.InnerBar'>