__new__与__init__的区别和应用场景
创建实例的时候, 先运行的_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__的区别和应用场景的更多相关文章
- Python 中的__new__和__init__的区别
[同] 二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多. [异] __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是 ...
- Python中__new__和__init__的区别与联系
__new__ 负责对象的创建而 __init__ 负责对象的初始化. __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回 ...
- __new__与__init__的区别
__new__ : 控制对象的实例化过程 , 在__init__方法之前调用 __init__ : 对象实例化对象进行属性设置 class User: def __new__(cls, *args, ...
- __new__和__init__的区别
__new__是一个静态方法,而__init__是一个实例方法. __new__方法会返回一个创建的实例,而__init__什么都不返回. 只有在__new__返回一个cls的实例时后面的__init ...
- __new__() 与__init__()的区别
__new__作用于__init__之前.前者可以决定是否调用后者,或者说可以决定调用那个类的__init__方法. 首先要知道在面向对象编程中,实例化基本遵循创建实例对象,初始化实例对象,最后返回实 ...
- 元类编程-- __new__和__init__的区别
class User: def __new__(cls, *args, **kwargs): print (" in new ") return super().__new__(c ...
- python __new__和__init__的区别
http://www.cnblogs.com/tuzkee/p/3540293.html 继承自object的新式类才有__new__ __new__至少要有一个参数cls,代表要实例化的类,此参数在 ...
- Python 中__new__()和__init__()的区别
转自: https://blog.csdn.net/weixin_37579123/article/details/89515577 __new__方法:类级别的方法 特性: 1.是在类准备将自身实例 ...
- __new__ 与 __init__的区别
原文地址:http://www.cnblogs.com/ifantastic/p/3175735.html 单例模式 class Singleton(object): def __new__(cls, ...
随机推荐
- 面试官:你有m个鸡蛋,如何用最少的次数测出鸡蛋会在哪一层碎?
假设你面前有一栋n层的大楼和m个鸡蛋,假设将鸡蛋从f层或更高的地方放扔下去,鸡蛋才会碎,否则就不会.你需要设计一种策略来确定f的值,求最坏情况下扔鸡蛋次数的最小值. leetcode原题链接 乍一看这 ...
- 一致性hash (PHP)
<?php /** * Flexihash - A simple consistent hashing implementation for PHP. * * The MIT License * ...
- 设计模式----创建型型模式之单件模式(Singleton pattern)
单件模式,又称单例模式,确保一个类只有一个实例,并提供全局访问点. 单件模式是比较简单且容易理解的一种设计模式.只有一个实例,通常的做法...TODO 类图比较简单,如下所示: 示例代码: 懒汉模式( ...
- 【CV现状-3.3】特征提取与描述
#磨染的初心--计算机视觉的现状 [这一系列文章是关于计算机视觉的反思,希望能引起一些人的共鸣.可以随意传播,随意喷.所涉及的内容过多,将按如下内容划分章节.已经完成的会逐渐加上链接.] 缘起 三维感 ...
- 写mysql语句时tab键与空格键
某网页上复制的一份mysql语句,报错,重写一遍后,好了,对比后,发现, 可以看到在sublime text中,网上复制的缩进是空白的,tab键是横杠,空格键是一个点
- redis系列之------字典
前言 字典, 又称符号表(symbol table).关联数组(associative array)或者映射(map), 是一种用于保存键值对(key-value pair)的抽象数据结构. 在字典中 ...
- bugku--web--输入密码查看flag
首先打开网页链接 随机五位数的密码爆破,先用python写一个脚本来生成随机五位数: x=range(0,10) f=open("3.txt",'w') for i in x: f ...
- postman动态数据获取
1.以获取token(JWT)和uid为例 2.在登录接口的tests中写入代码(因为登录接口报文信息中有返回JWT和uid) 3.在其他接口中需要用到JWT和uid的地方设置变量{{JWT}}和{{ ...
- Kali升级2018&&2019
0X01修改更新源 vim /etc/apt/sources.list #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-f ...
- [NOIp2010] luogu P1541 乌龟棋
英语老师讲 mind map,真想说一句"声微饭否".为什么wyy的歌词总是快一点点.在报csp. 题目描述 你在一个序列上向正方向行走,起点是 a[0]a[0]a[0].每一步可 ...