2016-02-25 131 views
0

我读过类似的问题,但找不到答案。从Python的内部类访问外部类对象3

这个问题是不是访问外部类的实例它的方法,但有关访问外类对象,应该是正常的任务。只要我们有__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' 

我认为它可以与外部的类装饰被解决了追加它类对象的所有嵌套类,但是有没有“干净”的方式来获得外部类对象?

回答

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'>