2024-09-26 18:06:16 发布
网友
如何获取在Python中定义方法的类?
我希望下面的示例打印“__main__.FooClass”:
__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)
我不知道为什么从来没有人提起过这个问题,也不知道为什么在速度慢得要命的情况下,最高分的答案会有50张赞成票,但你也可以这样做:
def get_class_that_defined_method(meth): return meth.im_class.__name__
对于python 3,我相信这已经改变了,您需要研究.__qualname__。
.__qualname__
感谢Sr2222指出我遗漏了要点。。。
这是正确的方法,就像亚历克斯的,但不需要输入任何东西。不过,我不认为这是一个改进,除非有一个继承类的巨大层次结构,因为一旦找到定义类,这种方法就会停止,而不是像getmro那样返回整个继承。如前所述,这是一个不太可能的情况。
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
我不知道为什么从来没有人提起过这个问题,也不知道为什么在速度慢得要命的情况下,最高分的答案会有50张赞成票,但你也可以这样做:
对于python 3,我相信这已经改变了,您需要研究
.__qualname__
。感谢Sr2222指出我遗漏了要点。。。
这是正确的方法,就像亚历克斯的,但不需要输入任何东西。不过,我不认为这是一个改进,除非有一个继承类的巨大层次结构,因为一旦找到定义类,这种方法就会停止,而不是像
getmro
那样返回整个继承。如前所述,这是一个不太可能的情况。举个例子:
Alex solution返回相同的结果。只要可以使用Alex方法,我就用它代替这个方法。
相关问题 更多 >
编程相关推荐