Просто, чтобы уточнить, когда вы определяете какой-либо атрибут, добавляется к __dict__
атрибуту Class
:
class A:
def a1(self):
pass
print('a1' in A.__dict__) # True Note: vars(A) == A.__dict__
и для проверки, является ли атрибут методом, используйте built-in
callable
witch возвращает True
, если объект callable
(функция, метод, класс и т. д.):
print(callable(A.__dict__['a1'])) # True
И теперь, даже если B
является подклассом A
но не определил a1
, что атрибут не добавляется в B.__dict__
:
class B(A):
pass
print('a1' in B.__dict__) # False
Так что, просто сравнивая значения из атрибутов __dict__
, вы получите, что метод ведьмы переопределен, метод ведьмыкоторые существуют в A.__dict__
и B.__dict__
override_method = [attr for attr in B.__dict__ if attr in A.__dict__ and callable(A.__dict__[attr])]
Примечание: Я мог бы заменить A.__dict__
на vars(A)
, чтобы упростить код, но я хотел показать этот специальный атрибут, которыйдобавлен python для нового разработчика Python.