南京建设银行网站首页,电商入门视频教程免费,做网站找谁好,对网站建设公司说魔法方法__new__()和__init__()真是困扰了我好久。其实就是对__new__()一直不是很理解。今天做一个小小的总结吧#xff0c;在这个知识点上真是花了太久的时间了。首先回顾一下类与对象python中一切皆为对象#xff0c;python类本身也是一种对象#xff0c;我们可以称其为类…魔法方法__new__()和__init__()真是困扰了我好久。其实就是对__new__()一直不是很理解。今天做一个小小的总结吧在这个知识点上真是花了太久的时间了。首先回顾一下类与对象python中一切皆为对象python类本身也是一种对象我们可以称其为类对象。对象属性方法对象是类的实例准确地来说应该是实例对象是类对象的实例。《python编程从入门到实践》中是这么说的面向对象编程是最有效的软件编写方法之一。在面向对象编程中你编写表示现实世界的实物和情景的类定义一大类对象都有的通用行为。基于类创建对象时每个对象都自动兼备这种通用行为然后可根据需要赋予每个对象独特的个性。根据类创建对象被称为实例化这让你能够使用类的实例。end类主要是定义对象的结构然后我们以类为模板创建对象。类不但包含方法定义还包含所有实例共享的数据。接下来进入正题。大家应该对__init__()方法都很熟悉它的第一个参数一定是self,__init__()方法负责对象的初始化系统执行该方法前其实该实例对象已经存在要不然初始化什么呢先看一小段代码class Dog():def __new__(cls, *args, **kwargs):print(run the new of dog)#return super(Dog,cls).__new__(cls)return object.__new__(cls) #两条return语句作用相同def __init__(self):print(run the init of dog)print(self)print(self.__class__)a Dog()# run the new of dog# run the init of dog# __main__.dog object at# 可以看出当我实例化Dog类对象时python中首先调用的是类对象的__new__()方法如果该对象没有定义__init__()方法则去父类中依次查找直到object类(object类是所有类的基类哦)。2. __new__()的返回语句中object.__new__(cls)意思是调用父类(object)的__new__()super()是一个特殊函数帮助python将父类和子类关联起来父类也成超类名称super因此得名。3. __new__()需要传递一个参数cls__init__()需要传递一个参数selfself代表的就是实例对象本身cls代表的是类对象本身。python中的self相当于C的this指针。__new__()必须要有返回值返回实例化出来的实例对象。4. 看一下阿里云天池python训练营对这两个魔法方法的教学__new__(cls[, ...]) 是在一个对象实例化的时候所调用的第一个方法在调用__init__初始化前先调用__new__。__new__至少要有一个参数cls代表要实例化的类此参数在实例化时由 Python 解释器自动提供后面的参数直接传递给__init__。__new__对当前类进行了实例化并将实例返回传给__init__的self。但是执行了__new__并不一定会进入__init__只有__new__返回了当前类cls的实例当前类的__init__才会进入。若__new__没有正确返回当前类cls的实例那__init__是不会被调用的即使是父类的实例也不行将没有__init__被调用。__new__方法主要是当你继承一些不可变的 class 时(比如int, str, tuple) 提供给你一个自定义这些类的实例化过程的途径。一般我们不会去重写__new__()方法除非你确切知道怎么做什么时候你会去关心它呢它作为构造函数用于创建对象是一个工厂函数专用于生产实例对象。著名的设计模式之一单例模式就可以通过此方法来实现。在自己写框架级的代码时可能你会用到它我们也可以从开源代码中找到它的应用场景例如微型 Web 框架 Bootle 就用到了。再来看几个例子。通常来说类开始实例化时__new__()方法会返回cls(cls指代当前类)的实例然后该类的__init__()方法会接收这个示例(即self)作为自己的第一个参数然后依次转入__new__()方法中接收的位置参数和命名参数。notice如果__new__()没有返回cls(即当前类的实例)那么当前类的__init__()方法是不会被调用的如果__new__()返回了其他类的实例那么只会调用被返回的那个类的构造方法。上代码class A(object):def __init__(self, *args, **kwargs):print(run the init of A)def __new__(cls, *args, **kwargs):print(run thr new of A)return object.__new__(B, *args, **kwargs)class B(object):def __init__(self):print(run the init of B)def __new__(cls, *args, **kwargs):print(run the new of B)return object.__new__(cls)a A()print(type(a))# run thr new of A# b B()print(type(b))# run the new of B# run the init of B# 这个例子也是参考网上自己修改的。感觉这个例子明白后对__new__()的理解就差不多了。接下来看一下单例模式。单例模式是什么举个常见的单例模式例子我们日常使用的电脑上都有一个回收站在整个操作系统中回收站只能有一个实例整个系统都使用这个唯一的实例而且回收站自行提供自己的实例。因此回收站是单例模式的应用。确保某一个类只有一个实例而且自行实例化并向整个系统提供这个实例这个类称为单例类单例模式是一种对象创建型模式。2. 创建单例-保证只有一个对象# 实例化一个单例class Singleton(object):__instance Nonedef __new__(cls, age, name):#如果类数字__instance没有或者没有赋值#那么就创建一个对象并且赋值为这个对象的引用保证下次调用这个方法时#能够知道之前已经创建过对象了这样就保证了只有1个对象if not cls.__instance:cls.__instance object.__new__(cls)return cls.__instancedef __init__(self,age,name):self.age ageself.name namea Singleton(18, wk)b Singleton(8, mm)print(id(a)id(b))print(a.age,a.name)print(b.age,b.name)a.size 19 #给a指向的对象添加一个属性print(b.size)#获取b指向的对象的age属性# True# 8 mm# 8 mm# 193. 创建单例只执行一次__init__()方法。# 实例化一个单例class Singleton(object):__instance None__first_init Falsedef __new__(cls, age, name):if not cls.__instance:cls.__instance object.__new__(cls)return cls.__instancedef __init__(self,age,name):if not self.__first_init:self.age ageself.name nameSingleton.__first_init Truea Singleton(18, wk)b Singleton(8, mm)print(id(a)id(b))print(a.age,a.name)print(b.age,b.name)a.size 19 #给a指向的对象添加一个属性print(b.size)#获取b指向的对象的age属性# True# 18 wk# 18 wk# 19奇妙基本ok了。总结下__init__()和__new__()的区别__init__()通常用于初始化一个新实例控制这个初始化的过程比如添加一些属性做一些额外的操作发生在类实例被创建完以后。它是实例级别的方法。__new__()通常用于控制生成一个新实例的过程。它是类级别的方法。__new__()至少有一个参数cls代表要实例化的类此参数在实例化时会有python编辑器自动提供。__new__()必须有返回值返回实例化出来的实例。如果将类比作制造商__new__()方法发就是前期的原材料环节__init__()方法就是在有了原材料的基础上加工初始化商品的环节。其他的魔法方法得再写一篇文章了真是参考了大量网上的例子真诚感谢前人们的博客、文章。