Вы можете сравнить все, что есть в классе __dict__, с функцией внутри метода, которую вы можете извлечь из объекта - функция-функция «detect_overriden» делает это - хитрость заключается в том, чтобы передать «родительский класс» для его имени, как одинделает в вызове "super" - иначе нелегко получить атрибуты из самого родительского класса вместо атрибутов подкласса:
# -*- coding: utf-8 -*-
from types import FunctionType
def detect_overriden(cls, obj):
res = []
for key, value in cls.__dict__.items():
if isinstance(value, classmethod):
value = getattr(cls, key).im_func
if isinstance(value, (FunctionType, classmethod)):
meth = getattr(obj, key)
if not meth.im_func is value:
res.append(key)
return res
# Test and example
class A(object):
def __init__(self):
print detect_overriden(A, self)
def a(self): pass
@classmethod
def b(self): pass
def c(self): pass
class B(A):
def a(self): pass
#@classmethod
def b(self): pass
edit изменил код, чтобы нормально работать стакже методы класса: если он обнаруживает метод класса в родительском классе, извлекает базовую функцию перед продолжением.
- Еще один способ сделать это без необходимости жесткого кодирования имени класса состоит в том, чтобы следовать за экземпляром экземпляра.порядок разрешения методов класса (self.__class__
) (заданный атрибутом __mro__
) и поиск дубликатов методов и атрибутов, определенных в каждом классе, по цепочке наследования.