获取嵌套类的外部类名称(Python)

时间:2016-10-21 09:45:23

标签: python class python-3.x nested

背景

(可能相关,因为可能有更简单的方法来实现我想要的。)

我想建立一种声明性的方式来定义"方面"可以通过静态代码分析工具进行分析。整个概念记下here。每个方面(比如Redundancy)都可以递归地具有子方面(比如Redundancy.Clone),并且每个方面都应该具有文档和任意其他属性。用户应该能够选择要分析的方面,并且我必须以编程方式找出方面的内部表示,如果它是用户选择的方面(即对于给定的类Redundancy.Clone我想要的验证它属于给定的字符串redundancy.clone但不属于redundancy.unused_import)。

我决定使用这样的课程:

class Redundancy(Aspect):
    """
    This meta aspect describes any kind of redundancy in your source code.
    """

    # Can't inherit from Redundancy here because of the recursion
    class Clone(Aspect):
        """
        This redundancy describes a code clone. Code clones are different pieces of
        code in your codebase that are very similar.
        """

        # Stuff...

问题

对于给定的Aspect类,我想获得描述字符串(Redundancy.Clone - > redundancy.clone)。为此,我必须得到周围模块/类的名称/它是什么,检查它是否是一个类(平凡)并从中构造一个字符串。

可能的解决方案及其失败方式

我确实试着查看我的课程的dir,看看我能使用的dunder方法中是否有任何有用的东西,但除了repr之外什么也没找到,在上面的例子中是生活在<class 'coalib.bearlib.aspects.Redundancy.Clone'>模块中时aspects。这表明它应该是可能的,但我不知道repr如何获取此信息,我希望避免使用repr并删除不需要的东西,因为这是一种黑客攻击

我无法从外部继承嵌套类,因为它尚未完全定义。我希望它们嵌套以实现可用性,能够from ... import Redundancy并且在我的源代码中写Redundancy.Clone是一个巨大的优势。

任何建议,包括改变我的方法,都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

您可以使用__qualname__PEP 3155

>>> class C:
...   def f(): pass
...   class D:
...     def g(): pass
...
>>> C.__qualname__
'C'
>>> C.f.__qualname__
'C.f'
>>> C.D.__qualname__
'C.D'
>>> C.D.g.__qualname__
'C.D.g'

答案 1 :(得分:0)

您可以在class Redundancy语句使用type类完成执行后构造类。例如:

class Aspect:
    pass

class Redundancy(Aspect):    

    @classmethod
    def init(cls):
       cls.make_Clone()

    @classmethod
    def make_Clone(cls):
        def __init__(self):
            print('inside Redundancy.Clone')

        methods = {} 
        methods["__init__"] =  __init__

        cls.Clone = type("{0}.Clone".format(cls.__name__), (Redundancy,), methods )

Redundancy.init()

print(Redundancy.Clone)
print(Redundancy.Clone())
# output:
#   <class '__main__.Redundancy.Clone'>
#   inside Redundancy.Clone
#   <__main__.Redundancy.Clone object at 0x01DCA130>