[gen] appy.Hack: added method 'inject' taht injects from some class all static attributes and method to another one.
This commit is contained in:
parent
477a533728
commit
7821280d35
31
__init__.py
31
__init__.py
|
@ -78,4 +78,35 @@ class Hack:
|
||||||
res = getattr(klass, '_base_%s_' % name)
|
res = getattr(klass, '_base_%s_' % name)
|
||||||
if isStatic: res = res.im_func
|
if isStatic: res = res.im_func
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def inject(patchClass, klass, verbose=False):
|
||||||
|
'''Injects any method or attribute from p_patchClass into klass.'''
|
||||||
|
patched = []
|
||||||
|
added = []
|
||||||
|
for name, attr in patchClass.__dict__.iteritems():
|
||||||
|
if name.startswith('__'): continue # Ignore special methods
|
||||||
|
# Is this name already defined on p_klass ?
|
||||||
|
if hasattr(klass, name):
|
||||||
|
hasAttr = True
|
||||||
|
klassAttr = getattr(klass, name)
|
||||||
|
else:
|
||||||
|
hasAttr = False
|
||||||
|
klassAttr = None
|
||||||
|
if hasAttr and callable(attr) and callable(klassAttr):
|
||||||
|
# Patch this method via Hack.patch
|
||||||
|
Hack.patch(klassAttr, attr)
|
||||||
|
patched.append(name)
|
||||||
|
else:
|
||||||
|
# Simply replace the static attr or add the new static
|
||||||
|
# attribute or method.
|
||||||
|
setattr(klass, name, attr)
|
||||||
|
added.append(name)
|
||||||
|
if verbose:
|
||||||
|
pName = patchClass.__name__
|
||||||
|
cName = klass.__name__
|
||||||
|
print '%d method(s) patched from %s to %s (%s)' % \
|
||||||
|
(len(patched), pName, cName, str(patched))
|
||||||
|
print '%d method(s) and/or attribute(s) added from %s to %s (%s)'%\
|
||||||
|
(len(added), pName, cName, str(added))
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in a new issue