从Python 3中的内部类访问外部类对象

时间:2016-02-25 10:59:07

标签: python python-3.x

我在SO上阅读了类似的问题,但无法找到答案。

这个问题关于访问外部类的实例或它的方法,但关于访问外部类对象应该是是正常的任务。只要我们__qualname__包含有关外部类名称的信息,就没有理由不能动态访问外部类对象。

这个例子做的工作:

class Outer:
    class Inner:
        @classmethod
        def parent_class(cls):
            outer_name = cls.__qualname__.split('.')[-2]
            outer_cls = globals()[outer_name]
            print(outer_cls)


Outer.Inner.parent_class()  # <class '__main__.Outer'>

但它不会在放置在另一个模块中的parent_class函数中起作用:

# some.py
class Some:
    @classmethod
    def parent_class(cls):
        outer_name = cls.__qualname__.split('.')[-2]
        outer_cls = globals()[outer_name]
        print(outer_cls)

# main.py
from some import Some


class Outer:
    class Inner(Some):
        pass

Outer.Inner.parent_class()  # KeyError: 'Outer'

我认为可以通过Outer的类装饰器解决它将它的类对象附加到所有嵌套类,但是有没有&#34; clean&#34;只是为了获得外部类对象?

1 个答案:

答案 0 :(得分:0)

看起来此解决方案适用于所有情况:

import sys


class Outer:
    class Inner:
        @classmethod
        def parent_class(cls):
            outer_name = cls.__qualname__.split('.')[-2]
            outer_module = sys.modules[cls.__module__]
            outer_cls = vars(outer_module)[outer_name]
            print(outer_cls)


Outer.Inner.parent_class()  # <class '__main__.Outer'>