我正在编写方法装饰器,并且需要访问定义当前装饰方法的类。
这个问题似乎是,除非实例化类,否则类中的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
答案 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