2016-02-25 177 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'>