Welcome, guest | Sign In | My Account | Store | Cart
import inspect
 
def mixin(cls):
   
"""
    mixes-in a class (or a module) into another class. must be called from within
    a class definition. `cls` is the class/module to mix-in
    """

    locals
= inspect.stack()[1][0].f_locals
   
if "__module__" not in locals:
       
raise TypeError("mixin() must be called from within a class definition")
   
   
# copy the class's dict aside and perform some tweaking
    dict
= cls.__dict__.copy()
    dict
.pop("__doc__", None)
    dict
.pop("__module__", None)
   
   
# __slots__ hell
    slots
= dict.pop("__slots__", [])
   
if slots and "__slots__" not in locals:
        locals
["__slots__"] = ["__dict__"]
   
for name in slots:
       
if name.startswith("__") and not name.endswith("__"):
            name
= "_%s%s" % (cls.__name__, name)
        dict
.pop(name)
        locals
["__slots__"].append(name)
   
   
# mix the namesapces
    locals
.update(dict)

#
# example
#
>>> class SomeMixin(object):
...     def f(self, x):
...         return self.y + x
...
>>> class AnotherMixin(object):
...     def g(self):
...         print "g"
...
>>>
>>> class Foo(object):
...     mixin(SomeMixin)
...     mixin(AnotherMixin)
...    
...     def h(self):
...         print "h"
...

History

  • revision 2 (17 years ago)
  • previous revisions are not available