__init__和__new__解释

__init__ 方法通常用在初始化一个类实例的时候使用,但是他并不是初始化类时第一个被调用的方法,第一个被调动的方法是__new__方法。

# -*- coding: utf-8 -*-

class Person(object):
    """Silly Person"""

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return ‘<Person: %s(%s)>‘ % (self.name, self.age)

if __name__ == ‘__main__‘:
    piglei = Person(‘piglei‘, 24)
    print piglei

__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。

# -*- coding: utf-8 -*-

class Person(object):
    """Silly Person"""

    def __new__(cls, name, age):
        print ‘__new__ called.‘
        return super(Person, cls).__new__(cls, name, age)

    def __init__(self, name, age):
        print ‘__init__ called.‘
        self.name = name
        self.age = age

    def __str__(self):
        return ‘<Person: %s(%s)>‘ % (self.name, self.age)

if __name__ == ‘__main__‘:
    piglei = Person(‘piglei‘, 24)
    print piglei

执行结果:

[email protected]pro:blog$ python new_and_init.py
__new__ called.
__init__ called.
<Person: piglei(24)>

通过运行这段代码,我们可以看到,__new__方法的调用是发生在__init__之前的。其实当 你实例化一个类的时候,具体的执行逻辑是这样的:

1.p = Person(name, age)
2.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, … …) 这样的方式),
3.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self
所以,__init__ 和 __new__ 最主要的区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法
但是说了这么多,__new__最通常的用法是什么呢,我们什么时候需要__new__?

http://python.jobbole.com/86506/

时间: 2024-11-02 23:23:50

__init__和__new__解释的相关文章

Python构造器及析构器:__init__与__new__及__del__

__init__与__new__这两个魔法方法组成了Python类对象的构造器,在Python类实例化时,其实最先调用的不是__init__而是__new__.__new__是负责实例化对象的,而__init__是初始化操作.__del__是析构器,当Python对象的所有引用都不存在了(被del了),就会自动触发__del__执行. class CapStr(str): def __new__(cls, string): #此时string = 'i love you' cls是CapStr这

Python中__init__和__new__的区别详解

__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __init__(self, name, age): self.name = name self.age = age def __

__init__和__new__

1 __init__和__new__的区别 1 当创建一个实例的时候会首先调用__new__, 然后在初始化实例的时候会调用__init__. 2 __new__是类级别的方法,__init__是个实例方法. 3 __new__方法会返回一个创建的实例,而__init__不需要有返回值 2 __new__ 实际应用 2.1 在元类中的应用 # 由type创建元类,必须要继承type class MetaClassFoo(type): # 由元类创建类也遵循 名字:继承:方法 def __new_

Python基础(十) __init__与__new__区别

__init__与__new__区别: __init__在python,其实是,在实例化之后执行的,用来初始化一些属性,相当于构造函数,但是又不一样 细心一些,通过参数会有所发现,其实__init__(self)  self隐式的将,实例传过来. __new__在python中其实是,在实例化之前执行的,这个通过参数一样可以看出 __new__(cls),cls是隐式的传递的类对象,并不是实例.因为__new__的任务就是,创建类实例并返回实例. class temp(object): def

__init__、__new__、__call__ 方法

__init__方法 __init__方法负责对象的初始化,系统执行该方法前,其实该对象已经存在了,要不然初始化什么东西呢?先看例子: # class A(object): python2 必须显示地继承objectclass A:    def __init__(self):        print("__init__ ")        super(A, self).__init__()    def __new__(cls):        print("__new_

Python中的__init__和__new__

一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __init__(self, name, age): self.name = name self.age = age def

python中的__init__和__new__的区别

一.__init__ 方法是什么?(init前后的线是双下划线) 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: 1 # -*- coding: utf-8 -*- 2 3 class Person(object): 4 """Silly Person""" 5 6 def __init__(self, name, age): 7 self.na

__init__和__new__的异同

实例化类的流程: 1.p = Person(name, age)2.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, - -) 这样的方式),3.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self所以,__init__ 和 __new__ 最主要的区别在于:1.

python中__init__()、__new__()、__call__()几个魔法方法的用法

关于__new__()的用法参考: http://www.myhack58.com/Article/68/2014/48183.htm 正文: 一.__new__()的用法: __new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python 中 存在于类里面的构造方法__init__()负责将类的实例化,而在__init__()启动之前,__new__()决定是否 要使用该__init__()方法,因为__new__()可以调用其他类的构造方法或者直接返回别