| # Copyright 2017 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import inspect |
| |
| def IsMethodOverridden(parent_cls, child_cls, method_name): |
| assert inspect.isclass(parent_cls), '%s should be a class' % parent_cls |
| assert inspect.isclass(child_cls), '%s should be a class' % child_cls |
| assert parent_cls.__dict__.get(method_name), '%s has no method %s' % ( |
| parent_cls, method_name) |
| |
| if child_cls.__dict__.get(method_name): |
| # It's overridden |
| return True |
| |
| if parent_cls in child_cls.__bases__: |
| # The parent is the base class of the child, we did not find the |
| # overridden method. |
| return False |
| |
| # For all the base classes of this class that are not object, check if |
| # they override the method. |
| base_cls = [cls for cls in child_cls.__bases__ if cls and cls != object] |
| return any( |
| IsMethodOverridden(parent_cls, base, method_name) for base in base_cls) |