Python构造方法、析构方法和单例模式
一、__init__()方法
__init__()通常在初始化一个类实例的时候调用,如:
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age stu = Student('weiheng',20) #创建一个Student实例,并且对对象属性初始化
print(stu.name)
在对象被创建后,调用__init__(),但__init__()其实不是实例化一个类的时候第一个被调用的,当Student()去实例化的时候,第一个被调用的使__new__()方法。
二、__new__()方法
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age def __new__(cls, *args, **kwargs):
print('创建一个对象')
# 创建cls类的一个实例并返回这个实例
return object.__new__(cls) stu = Student('weiheng',20) #创建一个Student实例,并且对对象属性初始化
print(stu.name)
当我们运行代码,会发现__new__()会在__init__()之前执行,其实创建一个对象具体的逻辑是:
stu = Student('weiheng',20):
1.首先执行Student()的__new__()方法返回一个Student的一个实例。
2.通过self来指向Student的一个实例,调用Student的__init__()方法进行对类进行初始化。
__init__()和__new__()的区别:
1.__init__()通过实例化一个实例,在类实例被创建之后调用,是一个实例方法;__new__()在实例化的时候调用,创建一个对象并返回这个实例对象
2.__init__()接收的是普通参数,而__new__()接收的是class,并且返回一个new object。
三、单例模式:__new__()的应用
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统等。
如在Window中,只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果所有窗口显示内容完全一致,将会产生重复对象,浪费资源。
一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
1.让类自身保存它的唯一实例
2.这个类可以保证没有其他实例被创建的,并且它可以提供一个访问该实例的方法
3.向整个系统提供这个实例
class Person(object):
_instance = None
def __init__(self,name,age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
if not Person._instance:
Person._instance = object.__new__(cls)
return Person._instance A = Person('zhangsan',30)
B = Person('zhangsan',30)
C = Person('wangwu',40) # instance = None
# print(bool(instance)) #False
# print(not instance) #True #1.
#创建了两个相同的对象.如果两个对象的内容完全一致的话,将会重复创建,浪费内存空间
print(id(A)) #
print(id(B)) # #2.
'''
1.让类自身保存类的实例
2.如果类实例不存在的话,就创建,如果存在,就返回已经创建的
'''
print(id(A)) #
print(id(C)) #
四、析构函数
析构函数正好和构造函数相反,当对象结束其生命周期的时候,系统会自动调用其析构函数,析构函数往往用于做一些"善后处理"工作,关闭程序所占用的资源。
构造函数会为对象开辟一块内存空间,当对象执行完毕后,会调用析构函数进行释放所占用的内存给操作系统。析构函数没有参数也没有返回值。
'''
析构函数和沟构造函数相反
当对象结束其生命周期的时候,系统会自动调用析构函数
析构函数往往做一些'清理善后'的工作,关闭一些占用的资源
构造函数创建一块内存空间,对象执行完毕后,会调用析构函数释放内存。
没有参数,也没有返回值
''' class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
print('create a new object.')
return object.__new__(cls) def __del__(self):
print('an object of deconstruction.') zhangsan = Person('zhangsan',30) #1.被动 当对象执行结束后,系统会自动调用__del__方法 #2.手动 del obj 会手动调用__del__方法,删除对象,回收所占用的资源
del zhangsan #会报错 NameErro name 'zhangsan' is not defined
print(zhangsan)
Python构造方法、析构方法和单例模式的更多相关文章
- 02.php面向对象——构造方法&析构方法
<?php //自己写的构造方法 class Computer{ public function Computer(){ echo '构造方法'; } } new Computer();//这样 ...
- 0604-面向对象、类与对象、类、static、构造方法/析构方法
一.面向对象 1.面向过程:一个人分步骤完成某个事情 2.面向对象:某件事情拆分为多个任务,由每个对象独立完成,最后调用整合为一个完整的项目 3.三要素:继承.封装.多态. 封装:私有化属性 提供公共 ...
- PHP-----类与对象,成员方法,成员属性,构造方法,析构方法
php里面的类-----class XX{},通过类的定义,可以使用调用类里面的成员属性和成员方法. 对象---一个类就是一个对象,一个对象可以有多个属性,一个类可以有多个成员方法. 构造方法:一个类 ...
- python 面向对象 析构方法
实例化但从来没有调用他,就浪费了,就应该自动删除它 这个实例一直存在内存里 python有个垃圾自动回收机制 , 每段时间会自动刷新整个内存,把内存垃圾东西删除 析构函数: 在实例释放.销毁的时候 ...
- Python 5种方法实现单例模式
基本介绍 一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点. 单例模式应该是应用最广泛,实现最简单的一种创建型模式. 特点:全局唯一,允许更改 优缺点 优点: 避免对资源的多重 ...
- python学习-(__new__方法和单例模式)
class Dog(object): __instance = None __init_flag = False def __new__(cls, name): if cls.__instance = ...
- 类的声明与实例化及构造方法析构方法(PHP学习)
<?php class human{ public static $leg=2; public $name = 'leo'; public $age = '25'; public functio ...
- php课程 12-38 php的类的构造方法和析构方法怎么写
php课程 12-38 php的类的构造方法和析构方法怎么写 一.总结 一句话总结:a.__construct(参数){},__destruct(){},b.如果类中的一个方法和类名相同,则该方法为构 ...
- 第8.18节 Python类中内置析构方法__del__
一. 引言 基本上所有支持OOP设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...
随机推荐
- 【刷题】BZOJ 4530 [Bjoi2014]大融合
Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...
- 【spring学习笔记二】Bean
### bean的三种实例化方式: 1.构造 2.静态工厂 3.实例工厂 其中,工厂就是工厂的概念,工厂函数factor-method会返回她生产出来的产品类. 而构造初始化也可以选择初始化方式和销毁 ...
- 【ActiveMQ】- 发布/订阅模式
publish/subscribe 特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息. 消息生产者: package com.zhiwei.advan ...
- 【转】64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解
64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解,开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛. 安装步骤 1.准备工具安装目录 下载 ar ...
- 洛谷 P3235 [HNOI2014]江南乐 解题报告
P3235 [HNOI2014]江南乐 Description 两人进行 T 轮游戏,给定参数 F ,每轮给出 N 堆石子,先手和后手轮流选择石子数大于等于 F 的一堆,将其分成任意(大于1)堆,使得 ...
- Nginx web服务优化 (一)
1.Nginx基本安全优化 a.更改配置文件参数隐藏版本 编辑nginx.conf配置文件增加参数,实现隐藏Nginx版本号的方式如下.在nginx配置文件nginx.conf中的http标签段内加入 ...
- Webpack 学习笔记总结
Webpack安装 Linux系统默认已经安装了node&npm,但版本比较低,而且没法升级,可以重新下载Node然后通过软链接替换系统自带的node和npm; ln -s /path_to/ ...
- centos6.5搭建LVS+Keepalived
1.配置LVS负载调度器 (1)为eth0配置IP地址,为eth0:0配置VIP地址. vi /etc/sysconfig/network-scripts/ifcfg-eth0 …… DEVICE=e ...
- C/C++:文本查询(单词查询)
如题: C/C++: Textqurey.h(方便看都在.h里实现了): // // Created by 徐爱东 on 17/7/10. // #ifndef TEXTQUERY_TEXTQUERY ...
- bzoj 4919 [Lydsy1706月赛]大根堆 set启发式合并+LIS
4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 599 Solved: 260[Submit][Stat ...