gpt4 book ai didi

python - 在 Python 3 中检测类(不是实例)中的绑定(bind)方法

转载 作者:行者123 更新时间:2023-12-03 20:20:58 24 4
gpt4 key购买 nike

给定一个类C使用函数或方法f , 我用 inspect.ismethod(obj.f) (其中 objC 的一个实例)来确定是否 f是否绑定(bind)方法。有没有办法在类级别直接做同样的事情(不创建对象)?

inspect.ismethod 不能这样工作:

class C(object):

@staticmethod
def st(x):
pass

def me(self):
pass

obj = C()

结果(在 Python 3 中):
>>> inspect.ismethod(C.st) 
False
>>> inspect.ismethod(C.me)
False
>>> inspect.ismethod(obj.st)
False
>>> inspect.ismethod(obj.me)
True

我想我需要检查函数/方法是否是类的成员而不是静态的,但我无法轻松做到。我想这可以使用 classify_class_attrs 来完成如此处所示
How would you determine where each property and method of a Python class is defined?
但我希望有另一种更直接的方式。

最佳答案

Python 3 中没有未绑定(bind)的方法,因此您也无法检测到它们。您所拥有的只是常规功能。最多你可以看看他们有没有qualified name with a dot ,表示它们是嵌套的,它们的第一个参数名称是self :

if '.' in method.__qualname__ and inspect.getargspec(method).args[0] == 'self':
# regular method. *Probably*

对于碰巧有 self 的静态方法和嵌套函数,这当然完全失败。作为第一个参数,以及不使用 self 的常规方法作为第一个论点(违背惯例)。

对于静态方法和类方法,您必须查看类字典:
>>> isinstance(vars(C)['st'], staticmethod)
True

那是因为 C.__dict__['st']是实际的 staticmethod例如,在 binding to the class 之前.

关于python - 在 Python 3 中检测类(不是实例)中的绑定(bind)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com