首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取已定义方法的类

获取已定义方法的类
EN

Stack Overflow用户
提问于 2009-06-07 02:18:12
回答 6查看 64.2K关注 0票数 106

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

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

代码语言:javascript
运行
复制
class FooClass:
    def foo_method(self):
        print "foo"

class BarClass(FooClass):
    pass

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

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-06-07 02:23:03

代码语言:javascript
运行
复制
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
票数 76
EN

Stack Overflow用户

发布于 2012-11-29 22:38:11

谢谢Sr2222指出我没有抓住重点。

下面是更正后的方法,它与Alex的方法类似,但不需要导入任何内容。我不认为这是一个改进,除非有一个巨大的继承类层次结构,因为一旦找到定义类,这种方法就会停止,而不是像getmro那样返回整个继承。如上所述,这是一个非常不可能的场景。

代码语言:javascript
运行
复制
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

下面是示例:

代码语言:javascript
运行
复制
>>> 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方法,我就会使用它而不是这个方法。

票数 9
EN

Stack Overflow用户

发布于 2017-10-03 05:09:47

我不知道为什么从来没有人提出过这个问题,也不知道为什么当它慢得像地狱一样慢的时候,排名靠前的答案有50个赞成票,但你也可以这样做:

代码语言:javascript
运行
复制
def get_class_that_defined_method(meth):
    return meth.im_class.__name__

对于Python3,我相信这一点已经改变了,你需要研究一下.__qualname__

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/961048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档