获取定义方法的类

2024-09-26 18:06:16 发布

您现在位置:Python中文网/ 问答频道 /正文

如何获取在Python中定义方法的类?

我希望下面的示例打印“__main__.FooClass”:

class FooClass:
    def foo_method(self):
        print "foo"

class BarClass(FooClass):
    pass

bar = BarClass()
print get_class_that_defined_method(bar.foo_method)

Tags: self示例getthatfoomaindefbar
3条回答

我不知道为什么从来没有人提起过这个问题,也不知道为什么在速度慢得要命的情况下,最高分的答案会有50张赞成票,但你也可以这样做:

def get_class_that_defined_method(meth):
    return meth.im_class.__name__

对于python 3,我相信这已经改变了,您需要研究.__qualname__

感谢Sr2222指出我遗漏了要点。。。

这是正确的方法,就像亚历克斯的,但不需要输入任何东西。不过,我不认为这是一个改进,除非有一个继承类的巨大层次结构,因为一旦找到定义类,这种方法就会停止,而不是像getmro那样返回整个继承。如前所述,这是一个不太可能的情况。

def get_class_that_defined_method(method):
    method_name = method.__name__
    if method.__self__:    
        classes = [method.__self__.__class__]
    else:
        #unbound method
        classes = [method.im_class]
    while classes:
        c = classes.pop()
        if method_name in c.__dict__:
            return c
        else:
            classes = list(c.__bases__) + classes
    return None

举个例子:

>>> class A(object):
...     def test(self): pass
>>> class B(A): pass
>>> class C(B): pass
>>> class D(A):
...     def test(self): print 1
>>> class E(D,C): pass

>>> get_class_that_defined_method(A().test)
<class '__main__.A'>
>>> get_class_that_defined_method(A.test)
<class '__main__.A'>
>>> get_class_that_defined_method(B.test)
<class '__main__.A'>
>>> get_class_that_defined_method(C.test)
<class '__main__.A'>
>>> get_class_that_defined_method(D.test)
<class '__main__.D'>
>>> get_class_that_defined_method(E().test)
<class '__main__.D'>
>>> get_class_that_defined_method(E.test)
<class '__main__.D'>
>>> E().test()
1

Alex solution返回相同的结果。只要可以使用Alex方法,我就用它代替这个方法。

import inspect

def get_class_that_defined_method(meth):
    for cls in inspect.getmro(meth.im_class):
        if meth.__name__ in cls.__dict__: 
            return cls
    return None

相关问题 更多 >

    热门问题