Source code for openmdao.utils.class_util
"""Various utils dealing with classes."""
import weakref
[docs]
def overrides_method(method_name, obj, base):
"""
Return True if the named base class method is overridden by obj.
Note that this only works if the overriding method is declared as part of the class, i.e.,
if the overriding method is added to the object instance dynamically, it will not be detected
and this function will return False.
Parameters
----------
method_name : str
Name of the method to search for.
obj : object
An object that is assumed to inherit from base.
base : class
The base class that contains the base version of the named
method.
Returns
-------
bool
True if the named base class method is overridden by obj's class or some class in its
class' mro, otherwise False.
"""
for klass in obj.__class__.__mro__:
if method_name in klass.__dict__:
return klass is not base
return False
[docs]
class WeakMethodWrapper(object):
"""
A class to contain a weak ref to a method.
weakerf.ref(obj.method) doesn't work, so this class will wrap a weak ref
to the method's parent object, look the method up in that instance by name, and call it.
Parameters
----------
obj : object
The instance object.
fname : str
The name of the method.
Attributes
----------
_ref : weakerf
The weakref to the method's owning instance.
__name__ : str
The name of the method.
"""
[docs]
def __init__(self, obj, fname):
"""
Initialize the wrapper.
"""
self._ref = weakref.ref(obj)
self.__name__ = fname
def __call__(self, *args, **kwargs):
"""
Call the named method on the object.
Parameters
----------
*args : tuple of obj
Positional args.
**kwargs : dict
Named args.
Returns
-------
object
The return value of the wrapped method called with the given args.
"""
return getattr(self._ref(), self.__name__)(*args, **kwargs)