获取定义方法的类
我怎样才能得到在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)
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
谢谢Sr2222指出我错过了点…
这是正确的方法,就像亚历克斯的,但不需要导入任何东西。 但是我不认为这是一个进步,除非有一个巨大的inheritance类的层次结构,因为一旦find定义的类,这种方法就会停止,而不是像getmro
那样返回整个inheritance。 如上所述,这是一个非常不可能的情况。
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解决scheme返回相同的结果。 只要Alex的方法可以使用,我会用它来代替这个。
我开始做一些有点类似的事情,基本上这个想法是在一个基类中的一个方法被实现或者不在一个子类中时进行检查。 原来我做这件事的方式,我无法检测到一个中间阶级实际上在实施这个方法的时候。
我的解决方法其实很简单, 设置方法属性并稍后testing它的存在。 这是整个事情的简化:
class A(): def method(self): pass method._orig = None # This attribute will be gone once the method is implemented def run_method(self, *args, **kwargs): if hasattr(self.method, '_orig'): raise Exception('method not implemented') self.method(*args, **kwargs) class B(A): pass class C(B): def method(self): pass class D(C): pass B().run_method() # ==> Raises Exception: method not implemented C().run_method() # OK D().run_method() # OK
更新:实际上从run_method()
调用method()
(是不是精神?),并让它传递所有参数未经修改的方法。
PS:这个答案不直接回答这个问题。 恕我直言,有两个原因,人们会想知道哪个类定义了一种方法; 首先是在debugging代码中指向一个类(例如在exception处理中),其次是确定该方法是否已被重新实现(其中方法是存储器意味着由程序员实现的)。 这个答案以不同的方式解决了第二种情况。
我不知道为什么没有人提出这个问题,或者为什么最高的答案有50个上升的时候,当它是缓慢的地狱,但你也可以做到以下几点:
def get_class_that_defined_method(meth): return meth.im_class.__name__
对于python 3我相信这改变了,你需要看看.__qualname__
。