首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取嵌套类的外部类名(Python)

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

Stack Overflow用户
提问于 2016-10-21 09:45:23
回答 2查看 1.3K关注 0票数 4

背景

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

我想要构建一种声明式的方法来定义可以通过静态代码分析工具来分析的“方面”。整个概念都写下来了,这里。每个方面(比如Redundancy)都可能递归地有子方面(比如Redundancy.Clone),每个方面都应该有文档和任意的其他属性。用户应该能够选择要分析的方面,如果是用户选择的方面(即对于给定的类Redundancy.Clone,我想验证它是否属于给定的字符串redundancy.clone,而不是redundancy.unused_import),则必须以编程方式查找该方面的内部表示形式。

我决定用这样的课程:

代码语言:javascript
复制
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,看看在did方法中是否有什么有用的东西,但是除了repr之外,什么都找不到,在上面的例子中,repr是在aspects模块中使用时的<class 'coalib.bearlib.aspects.Redundancy.Clone'>。这表明这是可能的,但我不知道repr是如何获得这些信息的,我希望避免使用repr,并删除不必要的内容,因为这是一种黑客行为。

我无法从外部继承嵌套类,因为它还没有完全定义。我希望它们嵌套在可用性上,能够使用from ... import Redundancy,在我的源代码中编写Redundancy.Clone是一个巨大的优势。

如有任何建议,包括改变我的做法,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-21 10:23:49

您可以使用__qualname__ (佩普3155)

代码语言:javascript
复制
>>> 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'
票数 4
EN

Stack Overflow用户

发布于 2016-10-21 10:30:33

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

代码语言:javascript
复制
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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40173362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档