python中__new__和__init__的区别是什么?

问题描述

python中__new__和__init__的区别是什么?
字数限制,
标题:python中__new__和__init__的区别,2.X版本中object.__call__的机制是什么?

书上是这样说的:
由于元类是type的一个子类,所以type类的__call__把创建和初始化新的类对象的调用委托给元类。type中的call调用meta中的__new__创建了一个新的类并返回。""

以下是我的猜测:
同样的机制也适用于普通类(也就是非元类)。
举例:
class B(object):
def new(cls *args **kwds):
print ""three""
print cls
print B
print ""B.__new__"" args kwds
return object.__new__(cls *args **kwds)
def init(cls *args **kwds):
print ""four""
print ""B.__init__"" args kwds

class A(object):
def new(cls *args **kwds):
print ""one""
print ""A.__new__"" args kwds
return object.__new__(B *args **kwds)
def init(cls *args **kwds):
print ""two""
print ""A.__init__"" args kwds

print A()
print ""=====================""
print B()
输出如下:
one
A.__new__ () {}

<__main__.B object at 0x027F3DD0>

three

B.__new__ () {}
four
B.__init__ () {}
<__main__.B object at 0x027F3CF0>

我的疑问是:为什么执行这条语句
return object.__new__(B *args **kwds)
之后,A.__init__没有被自动调用?

我猜测,__new__和__init__被默认调用,是由于object.__call__的存在。但是call里面的机制是什么呢。。。

解决方案

当创建A时,python发现__new__返回的不是A的实例,就不会调用__init__,因为这时python会疑惑到底应该调用A的__init__还是B的__init__,
所以这时候让你自己去控制不是挺好吗?
也就是说当调用a=A()是,python有一步判断
if isinstance(aA):
a.__init__(a*args**kwargs)

我自己写的一个可配置单例模式,想法来源于tornado的Configurable

解决方案二:
new:它是创建对象时调用,会返回当前对象的一个实例;

init:它是创建对象后调用,对当前对象的一些实例初始化,无返回值

解决方案三:
1 如果在类中同时定义了__init__和__new__,在创建对象的时候会有优先使用__new__


class A(object):
def init(self):
print(""in init"")
def new(self):
print(""in new"")

A()

2new方法会返回所构造的对象,init则不会,在使用new返回对象的时候会隐式调用init函数。new函数必须以cls作为第一个参数,而init则以self作为其第一个参数

实例:

class A(object):
def new(cls *args **kwds):
print ""one""
print ""A.__new__"" args kwds
return object.__new__(B *args **kwds)
def init(cls *args **kwds):
print ""two""
print ""A.__init__"" args kwds
class B(object):
def new(cls *args **kwds):
print ""three""
print cls
print B
print ""B.__new__"" args kwds
return object.__new__(cls *args **kwds)
def init(cls *args **kwds):
print ""four""
print ""B.__init__"" args kwds
class C(object):
def init(cls *args **kwds):
print ""five""
print ""C.__init__"" args kwds
print C()
print ""=====================""
print A()
print ""=====================""
print B()

利用new创建一个类的对象的最常用的方法为:super(currentclass cls).__new__(cls[ ...])
如下列

class A(object):
def new(cls):
Object = super(A cls).__new__(cls)
print ""in New""
return Object
def init(self):
print ""in init""

class B(A):
def init(self):
print ""in B's init""

B()

时间: 2024-11-02 09:54:33

python中__new__和__init__的区别是什么?的相关文章

PYTHON中__NEW__和__INIT__的区别例子

__NEW__和__INIT__的区别例子 Python中__new__和__init__用得最多的是__init__,__init__很像PHP,C,JAVA等其他语言中的构造方法,但是__new__也类似于构造方法,而且比__init__更早执行,它们有什么区别?怎么用? __init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- coding: utf-8

Python中__init__和__new__的区别详解_python

__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中的__new__与__init__魔术方法理解笔记_python

很喜欢Python这门语言.在看过语法后学习了Django 这个 Web 开发框架.算是对 Python 有些熟悉了.不过对里面很多东西还是不知道,因为用的少.今天学习了两个魔术方法:__new__ 和 __init__. 开攻: 如果对 Python 有所简单了解的话应该知道它包含类这个概念的.语法如下: 复制代码 代码如下: class ClassName:     <statement - 1>:         .         .           .     <state

Python中的__new__()方法与实例化

__new__()是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在Python中 存在于类里面的构造方法__init__()负责将类的实例化,而在__init__()启动之前,__new__()决定是否 要使用该__init__()方法,因为__new__()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例. 如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()

详解Python中的__init__和__new___python

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

python类中super()和__init__()的区别_python

单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'creat A ', Base.__init__(self) class childB(Base): def __init__(self): print 'creat B ', super(childB, self).__

Python中__init__.py文件的作用详解_python

__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加其他的功能.我们在导入一个包时,实际上是导入了它的__init__.py文件.这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入. # package # __init__.py import re import urllib import sys impo

Python中线程编程之threading模块的使用详解

  这篇文章主要介绍了Python中线程编程之threading模块的使用详解,由于GIL的存在,线程一直是Python编程中的焦点问题,需要的朋友可以参考下 threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.下面分别举例说明.先来看看通过继承th

Python中type的构造函数参数含义说明

  这篇文章主要介绍了Python中type的构造函数参数含义说明,本文用一个编码实例解释Python type的参数的作用和含义,需要的朋友可以参考下 测试代码如下: 代码如下: class ModelMetaClass(type): def __new__(cls,name,base,attrs): logging.info("cls is:"+str(cls)) logging.info("name is:"+str(name)) logging.info(&