day 7 __new___
1 __new__方法 创建对象
实质是:调用父类的__new__方法创建的对象
class Dog(object):
def __init__(self):
print("---init方法") def __str__(self):
print("---str方法") def __del__(self):
print("---init方法") def __new__(cls):
print("---new方法") dog1 = Dog()
---new方法 #只是创建了类对象,没有初始化,没有实例化对象
2)版本2: cls此时是Dog指向的那个类对象
class Dog(object):
def __init__(self):
print("---init方法") def __str__(self):
print("---str方法") def __del__(self):
print("---init方法") def __new__(cls):
print("---new方法")
print(id(cls)) print(id(Dog))
dog1 = Dog()
38097176
---new方法
38097176
3)版本3:调用 被重写的方法__new__ 创建对象
class Dog(object):
def __init__(self):
print("---init方法") def __str__(self):
print("---str方法") def __del__(self):
print("---del方法") def __new__(cls):
print("---new方法") #对父类的方法重写
# print(id(cls))
object.__new__(cls) #继续调用 被重写的方法 创建对象 #print(id(Dog))
dog1 = Dog()
---new方法
---del方法 #没有执行初始化
4)版本4 __init__ 只负责初始化
class Dog(object):
def __init__(self):
print("---init方法") def __str__(self):
print("---str方法") def __del__(self):
print("---del方法") def __new__(cls): #cls此时是Dog指向的那个类对象
print("---new方法")
# print(id(cls))
return object.__new__(cls) #print(id(Dog))
dog1 = Dog()
---new方法
---init方法
---del方法
5)版本5:优化版
class Dog(object):
#初始化 对象一创建开始执行
def __init__(self):
print("---init方法") def __str__(self):
print("---str方法")
return "返回对象的描述信息" #对象内存销毁时执行
def __del__(self):
print("---del方法") #通过父类的__new__方法创建对象
def __new__(cls): #cls此时是Dog指向的那个类对象
print("---new方法")
# print(id(cls))
return object.__new__(cls) #print(id(Dog))
dog1 = Dog()

相当于做了3件事情 1.调用__new__方法来创建对象,然后找了一个变量来接受__new__的返回值,这个返回值表示创建出来的对象的引用 2. __init__(刚刚创建出来的对象的引用) 3. 返回对象的引用
构造方法
__new__只负责创建
__init__ 只负责初始化 __new__ 和 __init__相当于C语言的构造方法
2. 创建单例对象
1)什么是单例

class Dog(object):
pass dog1 = Dog()
dog2 = Dog()
print(id(dog1))
print(id(dog2))
139888234067784 #不是同一块内存 不是同一个对象
139888234068008
2)版本2:
class Dog(object):
def __new__(cls):
if xxx :
return object.__new__(cls)
else:
return 上一次创建的对象的引用 dog1 = Dog()
dog2 = Dog()
3)版本3:flag标志
class Dog(object):
__flag = 0
def __new__(cls):
if flag == 0:
flag = 1
return object.__new__(cls)
else:
xxxxx dog1 = Dog()
dog2 = Dog()
4)版本4:类属性 实现
class Dog(object):
__flag = 0 #类属性 当做标志位 类属性是公有的
__instance = 0 #类属性 存储 上一次创建对象的引用
def __new__(cls): #这是一个类方法,cls指向类对象cls
if cls.__flag == 0:
cls.__flag = 1
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance dog1 = Dog()
dog2 = Dog()
#类方法
@classmethod
def add_num(cls): #cls指向类对象
cls.num += 1
#实例方法
def __init__(self,new_name):
self.name = new_name #self.name 是实例属性 ,实例对象独有的
#对类属性 +1
Dog.num += 1
5)版本5:__instance = None
class Dog(object):
__instance = None
def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance dog1 = Dog()
dog2 = Dog()
6)版本6:查看对应的内存id
class Dog(object):
__instance = None
def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance dog1 = Dog()
dog2 = Dog()
print(dog1)
print(dog2)
python@ubuntu:~/pythonS6/python基础092$ python3 08-单例对象.py
<__main__.Dog object at 0x7f46d4584828>
<__main__.Dog object at 0x7f46d4584828>
7)版本7:只初始化一次对象
class Dog(object):
__instance = None
def __new__(cls,name):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance def __init__(self,new_name):
self.name = new_name dog1 = Dog("tom") #单例对象 name='tom'
print(id(dog1))
print(dog1.name)
dog2 = Dog("jack") #同一对象 令name='jack'
print(id(dog2))
print(dog2.name)
140546425677920
tom
140546425677920
jack #如何让对象都是tom

8)版本8:添加flag
class Dog(object):
__instance = None
__flag = False
def __new__(cls,name):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance def __init__(self,new_name):
if Dog.__flag == False:
self.name = new_name
Dog.__flag = True dog1 = Dog("tom")
print(id(dog1))
print(dog1.name) #对象里面name = “tom”
dog2 = Dog("jack")
print(id(dog2))
print(dog2.name)
139813073586272
tom
139813073586272
tom #只初始化了一次对象
day 7 __new___的更多相关文章
- 面向对象的封装、继承和多态特性_python
一.面向对象的几个特点 面向对象也称为类,拥有下面几个特点 1.封装特性:利用类的__init__(self)构造方法封装对象 构造方法:__init__(self):在生成对象的时候会自动调用 例子 ...
随机推荐
- 1085. [SCOI2005]骑士精神【IDA※】
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...
- bzoj4403:序列统计
我好傻啊 题目 先来看看长度只能为\(n\)的情况 那么答案非常显然是\(\binom{m+n-1}{n}\) 其中\(m=R-L+1\) 因为我们要构造一个非降序列,显然可能一个数会被选择多次,组合 ...
- 【Vue】安装(NPM 方法)
[Vue2.0 新手完全填坑攻略——从环境搭建到发布]http://www.jianshu.com/p/5ba253651c3b 1.在用 Vue.js 构建大型应用时推荐使用 NPM 安装 2.Vu ...
- 3、Android-全局大喇叭-广播机制
所谓的官博机制可以理解成为1对多的概念 即一个喇叭所有的人都能听到(统一范围内) 为了便于及逆行系统级别的消息通知 Android引入了一套广播机制 而且更容易进行实现. 3.1.广播机制的简介 再A ...
- Python 模块化 模块搜索顺序、重复导入、模块加载列表(五)
模块搜索顺序.重复导入.模块加载列表 0x00 模块搜索顺序: 举例: #test.py import sys for p in sys.path: print(p) 运行结果: C:\python ...
- ethereumjs/ethereumjs-block-1-简介
https://github.com/ethereumjs/ethereumjs-block Encoding, decoding and validation of Ethereum's Block ...
- VC++6.0中碰到Cannot access the ClassView information file.ClassView information will not be avaible.的解决方法
一般情况下是由于类视图文件损坏了,这是经常会发生的现象. 解决步骤: 1.关闭工程,2.删除工程下.clw .ncb 文件及/debug目录,3.重建工程build all. 具体解释如下: dsp ...
- SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成ResultMap
其实我一点都不想用mybatis,好多地方得自己写,比如这里. 使用mybatis要写大量的xml,烦的一批.最烦人的莫过于写各种resultmap,就是数据库字段和实体属性做映射.我认为这里应该是m ...
- Jmeter服务器监控插件使用
Jmeter服务器监控插件使用 Jmeter-Plugins支持CPU.Memory.Swap.Disk和Network的监控,在测试过程中更加方便进行结果收集和统计分析. 一.准备工作: 1.下载J ...
- zabbix 表结构详情(基本)
zabbix表结构 1.acknowledges 记录告警的确认信息 2.actions 记录了当触发器触发时,需要采用的动作. mysql> desc actions; +---------- ...