在Python(2.7)中,可以使用嵌套的类声明,这有时可以方便地组织本地类。
但是,我无法弄清楚如何引用父类中的类,以便从中派生出来。
最小的例子就是:
class A(object):
class B(object):
pass
class C(object):
class D(A.B): # <-- fails with "NameError: name 'A' is not defined"
pass
如果给出类声明的嵌套结构,如何使D类派生自B类?
答案 0 :(得分:1)
你做不到。您无法将其引用为model
,因为A.B
尚未定义(您位于定义的中间),并且您无法将其引用为A
,因为根据B
PEP 227,类范围内的名称无法访问:
无法访问类范围中的名称。名称已解决 最里面的封闭功能范围。如果是一个类定义 在嵌套范围链中发生,解析过程会跳过 类定义。此规则可防止之间的奇怪交互 类属性和局部变量访问。如果名称绑定 操作发生在类定义中,它会创建一个属性 生成的类对象。要在方法中访问此变量, 或者在嵌套在方法中的函数中,属性引用 必须通过自己或通过班级名称使用。
另一种方法是在类中允许名称绑定 范围的行为与函数范围中的名称绑定完全相同。这个 规则允许通过引用类属性 属性引用或简单名称。该选项被排除在外 因为它会与所有其他形式的不一致 类和实例属性访问,它始终使用属性 引用。使用简单名称的代码会很模糊。
尽管如此,即使有可能,这种定义看起来也很模糊,可能会被重构为更简单的东西。
编辑:如果你真的,真的希望你的班级层次结构如此,你可以“猴子补丁”A
:
class A(object):
class B(object):
pass
class _C(object):
class D(A.B):
pass
A.C = _C