day30 __new__ 以及单例模式
__new__
# __new__
# object.__new__() class A :
def __init__(self):
self.x = 1
print("init执行啦")
def __new__(cls, *args, **kwargs):
print("new执行啦")
return object.__new__(A,*args,**kwargs) # __new__ 是不能自己创建对象的,因此他只能用object类中的__new__来创建一个实例化 a = A()
# 执行结果:
# new执行啦 # 先执行的是 new
# init执行啦 # new 是比 init 还要现执行。
# new的参数是cls 不是 self,
# init 创建self,但是new 比self 还要先执行,因此new执行的时候没有self,只有cls
# cls 表示上一层,即这个类本身
# __new__ 是不能自己创建对象的,因此他只能用object类中的__new__来创建一个实例化
设计模式 23种
单例模式 一个类始终只有一个实例
当你第一次实例化这个类的时候就创建一个实例化对象
当你之后实例化的时候就用之前的创建的对象,相当于所有的操作对象就那一个
class A :
__instance = False # 定义一个私有的变量,只能内部的去拿
def __init__(self,name,age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
if cls.__instance: # 第一次循环外部拿不到自然就是 Fales
return cls.__instance
else:cls.__instance = object.__new__(A) # 借助object类创建的实例并赋值
# 第一次创建的变量一定是fales的
# 返回一个借助object类创建的实例并赋值,
# 所创建的这个实例是什么都没有的,没有self的属性,只是开辟了一段空的内存地址给他用
# 之后在调用init 根据你的参数赋值属性添加内存
# __instance是保存在类里面的静态变量
# 以后每次进来都是使用cls.__instance 作为实例了
return cls.__instance # 返回一个全局的变量
suyang = A("sbb",2)
suyang.cloth = "none"
sb = A("suyang",2) # 在创建示例会覆盖之前的实例的属性,但是两个示例都是存在的
print(sb) # <__main__.A object at 0x000000000255D208>
print(suyang) # <__main__.A object at 0x000000000255D208>
print(suyang.name) # suyang
print(sb.name) # suyang # name 和age 都会被下一次实例化的时候被新值锁覆盖
print(suyang.cloth) # none # 尽管使用一个内存地址但是cloth 的属性没有被覆盖,而且保存在地址里面也不会被清除
print(sb.cloth) # none # sb示例并没有创建 cloth 属性,但是依然可以调用出来之前 suyang 示例的属性 ,即继承了之前的属性 sb.hobby = "sb"
print(suyang.hobby) # sb # 相同的没有创建 hobby 的 suyang 示例 也可以继承之后的 sb 创建的 hobby 属性
day30 __new__ 以及单例模式的更多相关文章
- 由Python通过__new__实现单例模式,所想到的__new__和__init__方法的区别
之前通过读书,了解到在Python中可以通过__new__方法来实现单例模式,代码一个示例如下,我就有了几个疑问,什么是单例模式?__new__方法是用来做什么的?用__new__方法实现的单例模式, ...
- Python __new__ 实现单例模式 python经典面试题
话不多说,上代码 class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance' ...
- Python中使用__new__实现单例模式并解析
阅读文章前请先阅读 Python中类方法.__new__方法和__init__方法解析 单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定 ...
- exec , 元类,__new__, __call__ , 单例模式 , 异常
1,类也是对象 ''' 动态语言 可以在运行期间 动态生成类 修改对象属性 静态语言 ''''' ''' type(object_or_name, bases, dict) type(object) ...
- python 内建函数__new__的单例模式
今天好奇__init__和__new__的区别是什么? 我了解到: __init__:只是单纯的返回一个类对象的实例,是在__new__之后调用的 __new__:创建一个类对象实例, class S ...
- Django_基于模块的单例模式
基于模块的单例模式 原理: Python 的独有特性 : 模块的导入只能生效一次. 再重复导入只要基于一套环境都是使用的 最初 的那份资源. 示例: 文档结构: # mysingleton.py ...
- Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)
一.面向对象编程几个特征(封装, 继承,多态) 1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用. 2.继承:子类可以继承父类的方法和属 ...
- Python学习笔记:单例模式
单例模式:一个类无论实例化多少次,返回的都是同一个实例,例如:a1=A(), a2=A(), a3=A(),a1.a2和a3其实都是同一个对象,即print(a1 is a2)和print(a2 is ...
- Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__
魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...
随机推荐
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- Libgdx学习记录28——创建Desktop程序
1.新建Java Project. 2.添加libs,添加相关的jar文件. 3. 在Project Build Path中,添加Reference. 4. 添加文件夹assets,并右键Build ...
- 异步编程(async&await)
前言 本来这篇文章上个月就该发布了,但是因为忙 QuarkDoc 一直没有时间整理,所以耽搁到今天,现在回归正轨. C# 5.0 虽然只引入了2个新关键词:async和await.然而它大大简化了异步 ...
- iOS开发简记(2):自定义tabbar
tabbar是放在APP底部的控件.常见的APP都使用tabbar来进行功能分类的管理,比如微信.QQ等等. 小程需要一个特殊一点的tabbar,要求突显中间的那个按钮,让中间按钮特别显眼,从而引导用 ...
- vue自定义公共组件components||在vue中,解决修改后的数据不能渲染到dom上的bug
//主页面框架用来嵌入:Main.vue <el-col :span="24" > * { margin: 0; padding: 0; } html { width: ...
- Rabbit and Grass
链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1849] 题意 大学时光是浪漫的,女生是浪漫的,圣诞更是浪漫的,但是Rabbit和Grass这两个大学女生 ...
- individual reading task ---12061183 叶露婷
Different people deserve different tasks; Once team roles are settled, there comes along a lot of ot ...
- 同步手绘板——android端下笔后颜色变化
实现效果 : 在设计之初我们以为是改变笔线条的粗细来实现类似效果,后来通过找其他相关软件比对发现是不改变线条的粗细,通过改变透明度实现下笔后颜色的渐变,虽然已实现,但渐变效果很一般,不流畅,算法还待优 ...
- Java awt项目开发
通过Java awt 界面上的知识编写的扫雷游戏 代码中有详细的注解 package com.langsin.saolei; import java.awt.Color;import java.awt ...
- HDOJ2004_成绩转换
水题:用数组标识各个阶段分数的等级即可. HDOJ2004_成绩转换 #include<stdio.h> #include<stdlib.h> #include<math ...