获取包含方法的类

时间:2013-10-15 17:31:34

标签: python python-3.x introspection

我正在编写方法装饰器,并且需要访问定义当前装饰方法的类。

这个问题似乎是,除非实例化类,否则类中的Python 3方法只是函数。

这有什么办法吗?我真的不想摆弄__qualname__ ......

In [29]: class A:
   ....:     def B(self):
   ....:         pass
   ....:     

In [30]: A.B.__qualname__
Out[30]: 'A.B'

# This is what I want:
>>> get_class(A.B)
A

1 个答案:

答案 0 :(得分:1)

你不能,因为当你的方法装饰器运行时,该类尚未创建

一个例子说明了这一点:

class Foo:
    @spam
    def bar(self): pass

当调用spam(bar)来生成一个修饰函数时,我们在Python运行的伪函数内部来定义类体。只有当伪函数执行完毕时,该函数的本地名称空间才会转换为类主体,并且创建实际的类对象本身。

这意味着在Foo运行时尚无spam()个类对象。

相反,创建一个类装饰器:

@spam
class Foo:
    def bar(self): pass

现在spam()传递完整的Foo类,让您可以访问类和方法。

如果您需要在类上标记要进行装饰的特定方法,可以使用标记装饰器来设置函数的属性:

def marker(func):
    func._marked = True
    return func

在类体中使用此装饰器放置您想要修饰的方法,然后使用类装饰器选择这些方法:

@spam
class Foo:
    @marker
    def bar(self): pass

    def baz(self): pass