RubyObject
classを宣言した時に、(スコープ内に)クラスが既に存在していれば、
既存のクラスを拡張しそれを返す。Rubyの様なclassの振舞を提供するメタクラス。
import inspect class RubyMetaClass(type): def __new__(self, classname, classbases, classdict): try: frame = inspect.currentframe() frame = frame.f_back if frame.f_locals.has_key(classname): old_class = frame.f_locals.get(classname) for name,func in classdict.items(): if inspect.isfunction(func): setattr(old_class, name, func) return old_class finally: del frame return type.__new__(self, classname, classbases, classdict) class RubyObject(object): __metaclass__ = RubyMetaClass
>>> class C: ... def foo(self): return "C.foo" ... >>> c = C() >>> print c.foo() C.foo >>> class C(RubyObject): ... def bar(self): return "C.bar" ... >>> print c.bar() C.bar