Python 获取包含类的方法

Python 获取包含类的方法,python,python-3.x,introspection,Python,Python 3.x,Introspection,我正在编写一个方法装饰器,需要访问定义当前装饰的方法的类 问题似乎在于,在类中的Python 3方法只是函数,除非类被实例化 这有什么办法吗?我真的不想摆弄\uuuuuuuqalname\uuuuuuu In [29]: class A: ....: def B(self): ....: pass ....: In [30]: A.B.__qualname__ Out[30]: 'A.B' # This is what I want: &g

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

问题似乎在于,在类中的Python 3方法只是函数,除非类被实例化

这有什么办法吗?我真的不想摆弄
\uuuuuuuqalname\uuuuuuu

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

不能,因为在方法上的装饰程序运行时,类尚未创建

一个例子更好地说明了这一点:

class Foo:
    @spam
    def bar(self): pass
当调用
spam(bar)
生成修饰函数时,我们就在Python运行以定义类主体的伪函数中。只有当伪函数完成执行时,该函数的本地名称空间才会转换为类主体,并创建实际的类对象本身

这意味着在运行
spam()
时,还没有
Foo
类对象

而是创建一个类装饰器:

@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

为什么不创建一个类装饰器呢?当装饰类主体中的函数时,该类尚未创建。@MartijnPieters,因为装饰器更改了装饰方法相对于包含类的语义
@decoration(“某些方法”)\n类Foo:…
似乎很不直观。如果没有替代方法,我将创建一个自定义基类或元类,并检查其中所有方法的属性。或者类似的东西。@Michael0x2a:不,那不是正确的副本。方法上的函数装饰器还不能确定类,因为在定义所有函数之前没有类对象。但是,装饰器不能使用
self.\uuuuuuu class\uuuu.\uuuu name\uuuuu
来实现这一点吗?。我的意思是,op没有提到装饰师要做什么。@PauloBu:一旦绑定,你就已经有了课程<代码>键入(self),无需再去获取名称。这不是问题所在。对不起,我只是加上
。\uuuuu name\uuuuu
来说明我的观点。我所指的是——我有疑问——方法修饰符有可能通过使用
self
参数访问方法的类。他仍然可以使用方法装饰器并访问其类。即使类还没有被创建,当方法被执行时,装饰者也只需访问
self.\uuuu class\uuu
,他就可以使用它。@PauloBu:这不是在装饰后执行方法的问题。这是关于在装饰期间访问类。那个时候还并没有类。@PauloBu:那个么静态方法呢?这些函数在绑定时忽略类引用。