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设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...
随机推荐
- Leetcode模拟题篇
43. Multiply Strings 高精度非负整数的乘法. string multiply(string num1, string num2) { '); ; <= i; --i) { ; ...
- Java开发23种设计模式
设计模式(Design Patterns) -- -- -- 可复用面向对象软件的基础 设计模式(Design Patterns)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. ...
- Jump Game - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Jump Game - LeetCode 注意点 解法 解法一:贪心算法,只关注能到达最远距离,如果能到达的最远距离大于结尾说明能到达,否则不能.并且如果 ...
- 【bzoj4541】 Hnoi2016—矿区
http://www.lydsy.com/JudgeOnline/problem.php?id=4541 (题目链接) 题意 给出一个平面图,若干询问,每次询问一个凸多边形内小多边形面积的平方和与面积 ...
- VS生成事件执行XCOPY时出现Invalid num of parameters的解决方案
最近想偷懒 想把项目生成的dll全部自动汇集到一个文件夹下 于是乎就动用了VS的生成后事件 在执行Xcopy的时候碰到了点问题 Invalid number of parameters 挺奇怪的,在公 ...
- 发现视口(窗口)自适应的新大陆!!vw、vh
从事前端已经1年了,一直为背景自适应铺满整个屏幕而苦苦发愁,因为要适配不同的pc显示器,所以高度不能写死,但是写(height:100%)并不能实现,愁死我了~我要不用写好的css框架实现或者自己写j ...
- html5页面头部
<base href="/bulid/"/> <meta charset="UTF-8"/> <meta http-equiv=& ...
- Spring Cloud微服务实战阅读笔记(一) 基础知识
本文系<Spring Cloud微服务实战>作者:翟永超,一书的阅读笔记. 一:基础知识 1:什么是微服务架构 是一种架构设计风格,主旨是将一个原本独立的系统拆分成多个小型服务 ...
- openstack虚拟机启动过程源码分析
源码版本:H版 以nova-api为起点开始分析! 一.在nova-api进程中进行处理 根据对nova api的分析,当请求发过来的时候,由相应的Controller进行处理,此处如下: nova/ ...
- 转:EasyJSWebView
EasyJSWebView 是类似 Android javascriptInterface 的 uiwebview js 调用原生代码框架 示例代码: 先建一个MyJSInterface接口 @in ...