<p>感谢Sr2222指出我遗漏了要点。。。</p>
<p>这是正确的方法,就像亚历克斯的,但不需要输入任何东西。不过,我不认为这是一个改进,除非有一个继承类的巨大层次结构,因为一旦找到定义类,这种方法就会停止,而不是像<code>getmro</code>那样返回整个继承。如前所述,这是一个不太可能的情况。</p>
<pre><code>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
</code></pre>
<p>举个例子:</p>
<pre><code>>>> 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
</code></pre>
<p>Alex solution返回相同的结果。只要可以使用Alex方法,我就用它代替这个方法。</p>