从Python中的嵌套类引用父类中的对象

时间:2015-09-14 02:31:07

标签: python class python-2.7 inheritance nested-class

在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类?

1 个答案:

答案 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