(可能相关,因为可能有更简单的方法来实现我想要的。)
我想建立一种声明性的方式来定义"方面"可以通过静态代码分析工具进行分析。整个概念记下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
是一个巨大的优势。
任何建议,包括改变我的方法,都会受到赞赏。
答案 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>