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设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...
随机推荐
- System Board Replacement Notice
System Board Replacement Notice System Board Replacement Notice for TP 770E and TP 600 Restoring the ...
- BZOJ3672 [Noi2014]购票 【点分治 + 斜率优化】
题目链接 BZOJ3672 题解 如果暂时不管\(l[i]\)的限制,并假使这是一条链 设\(f[i]\)表示\(i\)节点的最优答案,我们容易得到\(dp\)方程 \[f[i] = min\{f[j ...
- Android 图片加载框架 Glide 的用法
https://github.com/bumptech/glide Android图片加载框架最全解析(一),Glide的基本用法http://blog.csdn.net/guolin_blog/ar ...
- 解题:SDOI 2010 魔法猪学院
题面 题外话:神**可持久化左偏树,你谷的人都太神了,学不来 我把这个当做A*模板题的说,先讲一讲个人对A*的理解:如果说普通的BFS是Bellman_Ford,那A*就是一个Dijkstra.以寻找 ...
- 4:JAVA UUID 生成
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- windows service(system权限)创建用户权限进程
windows编程的人都知道,在其操作系统下,进程被创建,通常被赋予很多属性,其中一项属性就是用户名,及进程所属的权限.打开任务管理器,可查看到. 通常桌面系统explorer的权限是User权限,即 ...
- Python 爬虫入门(一)
毕设是做爬虫相关的,本来想的是用java写,也写了几个爬虫,其中一个是爬网易云音乐的用户信息,爬了大概100多万,效果不是太满意.之前听说Python这方面比较强,就想用Python试试,之前也没用过 ...
- POI上传,导入excel文件到服务器1
首先说一下所使用的POI版本3.8,需要用的的Jar包: dom4j-1.6.1.jarpoi-3.8-20120326.jarpoi-ooxml-3.8-20120326.jarpoi-ooxml- ...
- 《xxx重大需求征集系统的》可用性和可修改性战术分析
阅读<大型网站技术架构:核心与案例分析>,第五,六章,结合<河北省重大需求填报系统>,列举实例分析采用的可用性和可修改性战术,将上述内容撰写成一篇1500字左右的博客阐述你的意 ...
- 利用 Dijit 组件框架打造丰富的用户界面
原文出处:Joe Lennon 从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面 Dijit 是什么? Dijit 是 Dojo 工具包的富组件用户界面库.这些组件完 ...