python中的__new__和__init__

__new__() 方法的特性:

  • __new__()
    方法是在类准备将自身实例化时调用。
  • __new__()
    方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
class A(object): 
    def __init__(self): 
        print "init"
    def __new__(cls,*args, **kwargs): 
        print "new %s"%cls
        return object.__new__(cls, *args, **kwargs) 
  
A()

输出:

new <class ‘__main__.A‘>
init

知识点:

继承自object的新式类才有__new__。

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。

__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例。

__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。

若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行。

class A(object): 
    pass
  
class B(A): 
    def __init__(self): 
        print "init"
    def __new__(cls,*args, **kwargs): 
        print "new %s"%cls
        return object.__new__(A, *args, **kwargs) 
  
b=B() 
print type(b)

输出:

new <class ‘__main__.B‘>
<class ‘__main__.A‘>

参考资料:

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

http://www.cnblogs.com/tuzkee/p/3540293.html

时间: 2024-10-11 12:05:24

python中的__new__和__init__的相关文章

python中的__new__与__init__,新式类和经典类(2.x)

在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1. 新式类对象可以直接通过__class__属性获取自身类型:type 2. 继承搜索的顺序发生了改变,经典类多继承时属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧(即深度优先搜索);新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动 例子: 经典类: 搜索顺序是(D,B,A,C)>>&

深入理解Python中的 __new__ 和 __init__

本文为译文,原文链接:https://spyhce.com/blog/understanding-new-and-init 本文的目的是讨论Python中 __new__ 和 __init___ 的用法. __new__ 和 __init__ 的区别主要表现在:1. 它自身的区别:2. 及在Python中新式类和老式类的定义. 理解 __new__ 和 __init__ 的区别 这两个方法的主要区别在于:__new__ 负责对象的创建而 __init__ 负责对象的初始化.在对象的实例化过程中,

一个案例深入Python中的__new__和__init__

准备 在Python中,一切皆对象. 既然一切皆对象,那么类也是对象,我们暂且称之为 类对象.来个简单例子(本篇文章的所有案例都是运行在Python3.4中): class foo(): pass print(id(foo)) print(type(foo)) # 结果: # 46627056 # <class 'type'> 如果想深入了解一下,可以看:深刻理解Python中的元类(metaclass) 引入 最近在阅读tornado源码,发现在其源码中有很多类是这样的: class HTT

So easy:Python中的__new__、__init__、__call__

(望结交天下才士 ,Contact:UVEgMTkwNDUyOTQzOA==) __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self)__init__ : 对象的初始化, 是一个实例方法,第一个参数是self.__call__ : 对象可call,注意不是类,是对象. 先有创建,才有初始化.即先__new__,而后__init__.上面说的不好理解,看例子. 1.对于__new__ 1 class Bar(object):

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

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

Python系列之 __new__ 与 __init__

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

(转载)Python中:self和__init__的含义 +

(注:原文地址 Python中:self和__init__的含义 + 为何要有self和__init__) 背景 回复: 我写的一些Python教程,需要的可以看看 中SongShouJiong的提问: Python中的self,__init__的含义是啥? 为何要有self,__init这些东西? 解释之前,先说几句 1.到目前为止,我虽然也已写了不算很少的python的代码,但是,还真的没有太多接触self和__init__这两个东西. 只能算是大概了解. 2.为了搞懂其含义,现学现卖,去看

Python中:self和__init__的含义 + 为何要有self和__init__

Python中:self和__init__的含义 + 为何要有self和__init__ 背景 回复: 我写的一些Python教程,需要的可以看看 中SongShouJiong的提问: Python中的self,__init__的含义是啥? 为何要有self,__init这些东西? 解释之前,先说几句 1.到目前为止,我虽然也已写了不算很少的python的代码,但是,还真的没有太多接触self和__init__这两个东西. 只能算是大概了解. 2.为了搞懂其含义,现学现卖,去看了些资料,然后整理

Python中的__new__()方法的使用

__new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object:   @staticmethod # known case of __new__   def __new__(cls, *more): # known special case of object.__new__     """ T.__new__(S, ...) -> a new object with type S, a s