Поиск того, в каком классе или подклассе были определены методы

После оценки следующего кода:

class A():
  def method1():
    pass
  def method2():
    pass

class B(A):
  def method3():
    pass
  def method4():
    pass

class C(B):
  def method1(): # notice the overriding of A.method1
    pass
  def method5():
    pass

myC = C()
import inspect
# Find all methods
print [attr for attr in inspect.getmembers(myC) if callable(attr[1])]

[('method1', связанный метод C.method1 экземпляра ‹встроенного.C по адресу 0x079EA0D0>), ('method2', связанный метод C.method2 экземпляра ‹встроенного. Экземпляр C по адресу 0x079EA0D0>), ('method3', связанный метод C.method3 из ‹встроенного. Экземпляр C по адресу 0x079EA0D0>), ('method4', связанный метод C.method4 из ‹ экземпляр встроенного.C по адресу 0x079EA0D0), ('method5', экземпляр встроенного.C по адресу 0x079EA0D0>)]

Как получить происхождение методов?

  • method1 и method5 исходят непосредственно из определения класса C
  • method3 и method4 происходят из подкласса B класса C
  • method2 происходит от подкласса A подкласса B класса C.

Для тех, кто любит знать конечную цель, я хочу отобразить справку для методов, непосредственно определенных в классе C, а не в подклассах.


person user3650925    schedule 04.01.2017    source источник
comment
Это может сделать это stackoverflow.com/a/9437273/1587534, вы используете super() для получения родителя, вы сравниваете метод имена, сделано   -  person Saksow    schedule 04.01.2017
comment
Итак, ваш реальный вопрос заключается в том, как я могу получить методы, определенные непосредственно в C? На самом деле это проще, чем вопрос, который вы написали; просто загляните в C.__dict__.   -  person jonrsharpe    schedule 04.01.2017
comment
И да и нет. В моем программном обеспечении пользователь выбирает, до какой иерархической глубины ему нужна помощь по методам объекта. Спасибо.   -  person user3650925    schedule 04.01.2017


Ответы (2)


Вы можете проверить, присутствует ли атрибут в классе myC __dict__:

for attr in filter(lambda m: callable(m[1]), inspect.getmembers(myC)):
    if attr[0] in myC.__class__.__dict__:
        # print help
person a_guest    schedule 04.01.2017
comment
Спасибо. Это то, что я буду делать. - person user3650925; 04.01.2017

person    schedule
comment
Это решение является наиболее мощным для точного определения определения метода. - person user3650925; 04.01.2017