我在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;只是为了获得外部类对象?
答案 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'>