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'}}
View Code

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'}}
View Code

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'}}
View Code

 

转自:http://www.cnblogs.com/ifantastic/p/3175735.html

posted on 2018-01-31 15:32  Imindy  阅读(76)  评论(0)    收藏  举报

导航