python __new__() 和 __init__() 区别
在 Python 中,实例化一个类,一般就是 foo = Foo(),foo 是类 Foo 的实例。
在这个表达式底下,其实是通过调用 __new__ 和 __init__ 两个方法实现。其中 __new__ 是对象构造函数,__init__ 是初始化函数。foo = Foo() 这一表达式底下还有一个规则是,只有 __new__ 方法返回的是 Foo 类的实例,才会自动调用 __init__ 对 __new__ 返回的实例进行初始化。
其实 Python 构造实例的逻辑很简单,就是两个步骤,首先构造一个实例,然后初始化这个实例。如果你使用 Foo() 方法进行实例构造,那这两个步骤自动完成。如果你选择手动构造,那就要自己来控制构造实例与初始化实例。
eg1:
1 class Foo(object): 2 def __new__(cls, x, *args, **kwargs): 3 self = object.__new__(cls) 4 self.x = x 5 return self 6 def __init__(self, *args, **kwargs): 7 self.args = args 8 self.kwargs = kwargs 9 10 11 >>> foo = Foo(10, "args", name="bar") 12 >>> print foo.x, foo.args, foo.kwargs 13 10 (10, 'args') {'name': 'bar'} 14 15 >>> class Bar(Foo): 16 def __init__(self, *args, **kwargs): 17 self.bar_args = args 18 self.bar_kwargs = kwargs 19 20 21 >>> bar = Bar(10, "args", name="bar") 22 >>> print bar.__dict__ 23 {'x': 10, 'bar_args': (10, 'args'), 'bar_kwargs': {'name': 'bar'}}
eg2:
1 >>> class Foo(object): 2 def __new__(cls, *args, **kwargs): 3 self = object.__new__(cls) 4 self.x = args[0] 5 self.args = args 6 self.kwargs = kwargs 7 return self 8 9 10 >>> foo = Foo(10, "args", name="bar") 11 >>> print foo.x, foo.args, foo.kwargs 12 10 (10, 'args') {'name': 'bar'} 13 14 >>> class Bar(Foo): 15 def __init__(self, *args, **kwargs): 16 self.bar_args = args 17 self.bar_kwargs = kwargs 18 19 20 >>> bar = Bar(10, "args", name="bar") 21 >>> print bar.__dict__ 22 {'x': 10, 'args': (10, 'args'), 'bar_args': (10, 'args'), 'bar_kwargs': {'name': 'bar'}, 'kwargs': {'name': 'bar'}}
eg3:
1 >>> class Foo(object): 2 def __init__(self, *args, **kwargs): 3 self.x = args[0] 4 self.args = args 5 self.kwargs = kwargs 6 7 8 >>> foo = Foo(10, "args", name="bar") 9 >>> print foo.x, foo.args, foo.kwargs 10 10 (10, 'args') {'name': 'bar'} 11 12 >>> class Bar(Foo): 13 def __init__(self, *args, **kwargs): 14 self.bar_args = args 15 self.bar_kwargs = kwargs 16 17 18 >>> bar = Bar(10, "args", name="bar") 19 >>> print bar.__dict__ 20 {'bar_args': (10, 'args'), 'bar_kwargs': {'name': 'bar'}}
转自:http://www.cnblogs.com/ifantastic/p/3175735.html
浙公网安备 33010602011771号