【问题标题】:Refer to object in parent class from nested class in Python从 Python 中的嵌套类引用父类中的对象
【发布时间】:2015-09-14 02:31:07
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你不能。您不能将其引用为A.B,因为尚未定义A(您处于定义的中间),并且您不能将其引用为B,因为根据PEP 227类范围内的名称不可访问

    类范围内的名称不可访问。名称在 最里面的封闭函数范围。如果一个类定义 发生在嵌套范围链中,解析过程跳过 类定义。此规则可防止之间的奇怪交互 类属性和局部变量访问。如果一个名字绑定 操作发生在类定义中,它创建一个属性 生成的类对象。要在方法中访问此变量, 或者在嵌套在方法中的函数中,属性引用 必须通过 self 或通过类名来使用。

    另一种方法是允许在类中进行名称绑定 范围的行为与函数范围中的名称绑定完全相同。这个 规则将允许通过以下方式引用类属性 属性引用或简单名称。此选项已被排除 因为它与所有其他形式的 类和实例属性访问,总是使用属性 参考。使用简单名称的代码会很晦涩。

    也就是说,即使有可能,这种定义看起来也很模糊,可能可以重构为更简单的东西。

    编辑:如果你真的,真的希望你的类层次结构看起来像这样,你可以“猴子补丁”A

    class A(object):
        class B(object):
            pass
    
    class _C(object):
        class D(A.B): 
            pass
    
    A.C = _C
    

    【讨论】:

    • 您对重构很满意:B 不应该是 A 的一部分。但我仍然想知道是否可以编写它。 (我觉得它不是有点不满意。)
    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多