Python: 绕开 __init__

来源:岁月联盟 编辑:exp 时间:2011-04-15
某些时候我们需要绕开初始化函数来创建对象,比如做反序列化。
>>> class A(object):...     def __init__(self, x, y):...         print "init", x, y...         self.x = x...         self.y = y...     def test(self):...         print "test:", self.x, self.y...    >>> class _Empty(object): pass...>>> o = _Empty()>>> o.__class__ = A>>> o.x = 1>>> o.y = 2>>> o.test()test: 1 2>>> type(o)<class __main__.A>>>> isinstance(o, A)True

对于 classic class,我们还可以直接用 types.instance(),这样更简单一些。
>>> class A:...     def __init__(self, x, y):...         print "init:", x, y...         self.x = x...         self.y = y...     def test(self):...         print "test:", self.x, self.y...         >>> import types>>> a1 = types.InstanceType(A, dict(x = 1, y = 2))>>> a1.test()test: 1 2>>> a1.__class__<class __main__.A at 0x1025869b0>>>> class _Empty: pass... >>> a2 = _Empty()>>> a2.__class__ = A>>> a2.x = 1>>> a2.y = 2>>> a2.test()test: 1 2

可见 Python 的对象区别在于 __class__、__bases__ 和 __dict__ 这些,其他的好说。

顺便提一下 types module,我们也许还会用到下面这样的 "动态" 编程方式。
>>> import sys, types>>> sys.modules["X"] = types.ModuleType("X", "test module")>>> import X>>> X.__doc__test module

图片内容