创建实例的时候, 先运行的_new_方法, _new_创建对象 Student object(实例)返回给 _init_ 里面的第一个参数self

class Student(object):
def __new__(cls,name):
cls.m=2
print("__new__运行了")
print(super().__new__(cls))
return super().__new__(cls) def __init__(self,name):
self.name=name
print(self)
print("__init__运行了") c=Student("小明")
print(c.name,c.m)
'''
__new__运行了
<__main__.Student object at 0x02025530>
<__main__.Student object at 0x02025530>
__init__运行了
小明 2
'''
  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
  • __new__ 至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
  • __new__ 的参数除了cls外要有和实例化类给出的参数数量一致
  • __new__也可以设置对象属性(如果init重新设置了对象属性那么将被覆盖)
  • self代表的是类的实例,而cls则代表的是类本身

__new__的运用场景

  • 创建对象时候,同时创建一个类变量
  • 允许继承不可变类型(str,int, tuple)
  • 实现单例设计模式

允许继承不可变类型

用__new__来生成一个正数的类

class PositiveInteger(int):
def __new__(cls,value): return super(PositiveInteger,cls).__new__(cls,abs(value)) def __init__(self,value):
super(PositiveInteger,self).__init__() c = PositiveInteger(-1)
print(c) #打印出1

实现单例设计模式

单例设计模式是为了解决一个类有多个对象的时候,多个对象引用同一个内存地址,以减少内存占用的问题

实现思路:

重写父类的__new__方法,使每次返回的内存地址引用都为同一个

class Singleton(object):
boolean = None
def __new__(cls): if cls.boolean == None:
cls.boolean = super().__new__(cls)
return cls.boolean c1 = Singleton()
c2 = Singleton()
print(c1)
print(c2) '''
<__main__.Singleton object at 0x02485670>
<__main__.Singleton object at 0x02485670>
'''

可以看出我们创建了两个实例,并且返回的内存都是一样的,这避免了内存的重复占用

__new__与__init__的区别和应用场景的更多相关文章

  1. Python 中的__new__和__init__的区别

    [同] 二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多. [异] __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是 ...

  2. Python中__new__和__init__的区别与联系

    __new__ 负责对象的创建而 __init__ 负责对象的初始化. __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回 ...

  3. __new__与__init__的区别

    __new__  : 控制对象的实例化过程 , 在__init__方法之前调用 __init__ : 对象实例化对象进行属性设置 class User: def __new__(cls, *args, ...

  4. __new__和__init__的区别

    __new__是一个静态方法,而__init__是一个实例方法. __new__方法会返回一个创建的实例,而__init__什么都不返回. 只有在__new__返回一个cls的实例时后面的__init ...

  5. __new__() 与__init__()的区别

    __new__作用于__init__之前.前者可以决定是否调用后者,或者说可以决定调用那个类的__init__方法. 首先要知道在面向对象编程中,实例化基本遵循创建实例对象,初始化实例对象,最后返回实 ...

  6. 元类编程-- __new__和__init__的区别

    class User: def __new__(cls, *args, **kwargs): print (" in new ") return super().__new__(c ...

  7. python __new__和__init__的区别

    http://www.cnblogs.com/tuzkee/p/3540293.html 继承自object的新式类才有__new__ __new__至少要有一个参数cls,代表要实例化的类,此参数在 ...

  8. Python 中__new__()和__init__()的区别

    转自: https://blog.csdn.net/weixin_37579123/article/details/89515577 __new__方法:类级别的方法 特性: 1.是在类准备将自身实例 ...

  9. __new__ 与 __init__的区别

    原文地址:http://www.cnblogs.com/ifantastic/p/3175735.html 单例模式 class Singleton(object): def __new__(cls, ...

随机推荐

  1. httpSession和Cookie

    1.session在何时被创建一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true) ...

  2. python串口助手

    最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试. 在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口 ...

  3. idea中的java web项目(添加jar包介绍)和java maven web项目目录结构

    java web项目 web项目下web根目录名称是可以更改的 idea中新建java web项目,默认src为Sources Root,当然也可以手动改,在Sources Root下右键只能新建Pa ...

  4. XCTF-upload

    这道题的话,看了一下是RCTF-2015的原题....可是这也太难了吧QAQ,文件名作为注入点可也是太秀了,害的我一直以为是文件上传QAQ,并且这道题的坑还不少,就是注入时的输出只能为10进制.... ...

  5. cocos2d-x 系统学习cocos(1)

    简析HelloWorld场景 以前使用cocos2d-x 3.14的时候,HelloWorld并不是一个场景类,而是一个图层类,当时的HelloWorld::createScene()是长这样的 Sc ...

  6. UDP方式的传输

    UDP 部分内容需要查文档学习,我们需要了解下面的两个类:java.net.DatagramSocket和java.net.DatagramPacket java.net.DatagramSocket ...

  7. drf框架中所有视图及用法

    0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...

  8. CSRF漏洞实战靶场笔记

    记录下自己写的CSRF漏洞靶场的write up,包括了大部分的CSRF实战场景,做个笔记. 0x01 无防护GET类型csrf(伪造添加成员请求) 这一关没有任何csrf访问措施 首先我们登录tes ...

  9. oracle数据库的安全测试

    Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前世界上 ...

  10. Windows 批处理入门

    Windows 批处理入门   目录 本教程概述 用到的工具 标签 简介 1.命令简介 2.符号简介 3.语句结构 4.实例讲解 本教程概述 本课我们学习windows批处理 用到的工具 cmd.ex ...