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设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...
随机推荐
- 【BZOJ3293】分金币(贪心)
[BZOJ3293]分金币(贪心) 题面 BZOJ 洛谷 题解 和上一题一样啊. #include<cstdio> #include<cmath> #include<al ...
- BZOJ4868 [Shoi2017]期末考试 【三分 + 贪心】
题目链接 BZOJ4868 题解 最后的答案决定于最后一个公布的成绩 显然这个是答案关于这个时间点是呈凸单调的 三分一下这个时间点 时间点固定,在这个时间前的人都会产生不愉快度,在这个时间前的科目可以 ...
- BZOJ2876 [Noi2012]骑行川藏 【拉格朗日乘数法】
题目链接 BZOJ 题解 拉格朗日乘数法 拉格朗日乘数法用以求多元函数在约束下的极值 我们设多元函数\(f(x_1,x_2,x_3,\dots,x_n)\) 以及限制\(g(x_1,x_2,x_3,\ ...
- 洛谷 P1199 三国游戏 解题报告
P1199 三国游戏 题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有\(N\)位武将(\(N\)为 ...
- Dubbo、Zookeeper集群搭建及Rose使用心得(一)
接触这个两三月了,是时候总结一下使用的方法以及心得体会了.我是一个菜鸟,下面写的如有错误,还请各位前辈指出.废话不多说,正式开始. 一.简介 Dubbo是Alibaba开源的分布式服务框架,它最大的特 ...
- linux kill 掉所有匹配到名字的进程
如,要 kill 掉 swoole 相关的进程 ps aux | grep swoole | awk '{print $2}' | xargs kill -9 ps 列出所有进程, 参数: a - ...
- 服务器(Linux) 安装python3
1.python3和python2可以共存,不用删自带的python2 服务器Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除.如果使用最新的Python ...
- python 调用aiohttp
1. aiohttp安装 pip3 install aiohttp 1.1. 基本请求用法 async with aiohttp.get('https://github.com') as r: a ...
- java8 新特性 Stream
1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...
- Maven学习二:使用Nexus搭建Maven私服及相关配置
处于安全等原因的考虑,一些企业内部网络是不允许访问外部网络的,但是项目内部搭建的项目又是Maven架构,这样就需要企业在内部网络中搭建自己的Maven仓库服务,再者一些大型企业或者内部模块化组件化划分 ...