python面向对象设计管理系统_python面向对象之单例设计模型

单例

目标

单例设计模式

`__new__` 方法

Python 中的单例

01. 单例设计模式

设计模式

设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案

使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性

单例设计模式

目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例

每一次执行 `类名()` 返回的对象,内存地址是相同的

单例设计模式的应用场景

音乐播放 对象

回收站 对象

打印机 对象

02. `__new__` 方法

使用 类名() 创建对象时,`Python` 的解释器 首先 会 调用 `__new__` 方法为对象 分配空间

`__new__` 是一个 由 `object` 基类提供的 内置的静态方法,主要作用有两个:

1) 在内存中为对象 分配空间

2) 返回 对象的引用

`Python` 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给 `__init__` 方法

> 重写 `__new__` 方法 的代码非常固定!

重写 `__new__` 方法 一定要 `return super().__new__(cls)`

否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法

注意:`__new__` 是一个静态方法,在调用时需要 主动传递 `cls` 参数

示例代码

```python

class MusicPlayer(object):

def __new__(cls, args, kwargs):

如果不返回任何结果,

return super().__new__(cls)

def __init__(self):

print("初始化音乐播放对象")

player = MusicPlayer()

print(player)

03. Python 中的单例

单例 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例

1. 定义一个 类属性,初始值是 `None`,用于记录 单例对象的引用

2. 重写 `__new__` 方法

3. 如果 类属性 `is None`,调用父类方法分配空间,并在类属性中记录结果

4. 返回 类属性 中记录的 对象引用

```python

class MusicPlayer(object):

定义类属性记录单例对象引用

instance = None

def __new__(cls, args, kwargs):

1. 判断类属性是否已经被赋值

if cls.instance is None:

cls.instance = super().__new__(cls)

2. 返回类属性的单例引用

return cls.instance

只执行一次初始化工作

在每次使用 `类名()` 创建对象时,`Python` 的解释器都会自动调用两个方法:

`__new__` 分配空间

`__init__` 对象初始化

在上一小节对 `__new__` 方法改造之后,每次都会得到 第一次被创建对象的引用

但是:初始化方法还会被再次调用

需求

让 初始化动作 只被 执行一次

解决办法

1. 定义一个类属性 `init_flag` 标记是否 执行过初始化动作,初始值为 `False`

2. 在 `__init__` 方法中,判断 `init_flag`,如果为 `False` 就执行初始化动作

3. 然后将 `init_flag` 设置为 `True`

4. 这样,再次 自动 调用 `__init__` 方法时,初始化动作就不会被再次执行 了

```python

class MusicPlayer(object):

记录第一个被创建对象的引用

instance = None

记录是否执行过初始化动作

init_flag = False

def __new__(cls, args, kwargs):

1. 判断类属性是否是空对象

if cls.instance is None:

2. 调用父类的方法,为第一个对象分配空间

cls.instance = super().__new__(cls)

3. 返回类属性保存的对象引用

return cls.instance

def __init__(self):

if not MusicPlayer.init_flag:

print("初始化音乐播放器")

MusicPlayer.init_flag = True

创建多个对象

player1 = MusicPlayer()

print(player1)

player2 = MusicPlayer()

print(player2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言简单说】十八:二维数组

这里可能会让大家脑袋迷糊,不过没事,多动动脑。 这一节我们来说二维数组,啥叫二维数组?之前我们那个是一维数组,好了,我们接下来大家就会慢慢的搞懂的。 我们的一维数组就像 一列排得整整齐齐的队伍&…

移动web开发(一)——移动web开发必备知识

参考: 移动终端开发必备知识.http://isux.tencent.com/mobile-development-essential-knowledge.html

剑指offer之求两个链表的第一个公共节点

1 问题 输入两个链表,找出它们的第一个公共结点。 含有公共节点的两个链表的结构类似于下图中的链表: 1 -> 2 -> 3 -> 4 ->5 2 -> 4 ->5 可以看到两个链表中有一个公共节点,其中4节点就是这两个链表的公共节点 2 分析…

.Net Core 限流控制-AspNetCoreRateLimit

简介AspNetCoreRateLimit是ASP.NET核心速率限制框架,能够对WebApi,Mvc中控制限流,AspNetCoreRateLimit包包含IpRateLimit中间件和ClientRateLimit中间件,每个中间件都可以为不同的场景设置多个限,该框架的作者是stefan…

应用系统日志采集解决方案

概述 基于Flume MongoDB,对现有的多个应用系统进行日志采集。特点 采集范围每一次用户请求的请求信息。数据量大尽量减少现有系统的改动数据流图 说明:首先考虑的结构体系,是直接在应用系统中,将日志数据写到Flume;但…

0x00000001java_「十六进制表示」0x00000001是个啥?32位表示、十六进制表示 - seo实验室...

十六进制表示0x0000 0001首先他是个16进制的数字、8进制的是0开头的、比如 077 他是八进制的、十进制的话就是63、7*87630x0000 0001他表示一个32位的、因为十六进制的一位有16种变化、四位的变化也是16种。那么、想表示32位的数据、需要16进制的bit 0000 0000 0000 0000 0000 …

每个程序员都可能犯过的10个错误

1. 面向编译器写代码,而不是面向用户 当人们使用编译器创建自己的 app 时,在把自己的想法诉诸于机器代码的过程中,常常会将那些可以使得编程更为简单却又冗长的语法遗忘于脑后。 无论你使用的是单字母的标识符还是更易于人脑理解的标识符&…

C#趣味程序---爱因斯坦的台阶问题

问题:设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶,刚好到阶顶,问共有多…

【C语言简单说】十九:二维数组循环嵌套(1)

(▼ _ ▼) 又到了这一节 了,这是痛苦的一节,因为我完全不懂如何像新手说明循环嵌套。。。 因为很多新手理解不了。,我就直接拿我以前的教程复制上来了。 首先先说循环嵌套: 循环嵌套的意思就是循环里面有一个循环,例…

剑指offer之C语言实现链表(两种方式)

1 问题 用C语言实现链表 2 代码实现 #include <stdio.h> #include <stdlib.h>#define true 0 #define false -1typedef struct Node {int value;struct Node *next; } List;/***初始化链表*/ struct Node* init_list() {struct Node *head (struct Node*)malloc…

python数据类型描述_【文山玩Python】用python的数据类型,来简单的描述世界

前文讲过&#xff0c;编程语言是对现实世界的抽象与模拟&#xff0c;那么数据类型就是用来构造模拟现实世界的工具。那么python中的数据类型&#xff0c;在现实生活中可以找到那些原型呢&#xff1f;我们先回顾一个幼儿教育的过程&#xff1a;出生后&#xff0c;我们先教的是什…

Xamarin效果第二十二篇之录音效果

在前面文章中简单玩了玩GIS的基本操作、Mark相关、AR、测距、加载三维白模和可扩展浮动操作;今天抽空再来分享一下录音效果;啥也不说了都在效果里:1、首次尝试了开源的Plugin.AudioRecorder结果发现没效果,也可能是我的姿势不对:https://github.com/NateRickard/Plugin.AudioRe…

@action 注解

下载 注解配置 private String fileName; private String contentType "application/octet-stream"; Action(value "/download", results { Result(name "download", type"stream", params{ "contentType"…

从零开始来看一下Java泛型的设计

引言 泛型是Java中一个非常重要的知识点&#xff0c;在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计&#xff0c;将会涉及到通配符处理&#xff0c;以及让人苦恼的类型擦除。 泛型基础 泛型类 我们首先定义一个简单的Box类&#xff1a; public c…

6.对象和数组

对象和数组 学习要点&#xff1a;1.Object类型2.Array类型3.对象中的方法 什么是对象&#xff0c;其实就是一种类型&#xff0c;即引用类型。而对象的值就是引用类型的实例。在ECMAScript中引用类型是一种数据结构&#xff0c;用于将数据和功能组织在一起。它也常被称作为类&am…

php json error,PHP 7.3 中的 JSON 错误处理

PHP 7.3 为 json_encode() 和 json_decode() 函数增加的一个新特性使其更好的处理错误。这个特性「 RFC 」以 23 比 0 的投票结果被一致接受。让我们看一看在 PHP 7.2 及一下版本中是如何处理 JSON 错误的&#xff0c;以及 PHP 7.3 中新的改进。背景当前在 PHP7.2 版本中&#…

C#趣味程序---三色球问题

问题&#xff1a;若一个口袋中放有12个球&#xff0c;3红3白和6黑&#xff0c;问从袋中任意取8个球&#xff0c;有多少种不同的颜色搭配&#xff1f; using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){Console.WriteLine("共有…

剑指offer之C++语言实现链表(两种删除节点方式)

1 问题 用C语言实现链表 2 代码实现 #include <iostream> #include <stdlib.h>using namespace std;class List { public:List();~List();List* createNode(int value);//创建节点bool insertNode(List *node);//插入节点void printList();//打印节点bool delete…

【C语言简单说】十九:二维数组循环嵌套(2)

这节直接用循环嵌套来输出二维数组了&#xff1a; 注&#xff1a;我说的队和列并不是一般说法&#xff0c;我用此比喻好让新手更好理解。 #include<stdio.h> #include<stdlib.h> int main() {int array[2][3]{1,2,3,4,5,6};//第一句 int i,j;//第二句 for(i0;i&l…

C# 11 对 ref 和 struct 的改进

前言C# 11 中即将到来一个可以让重视性能的开发者狂喜的重量级特性&#xff0c;这个特性主要是围绕着一个重要底层性能设施 ref 和 struct 的一系列改进。但是这部分的改进涉及的内容较多&#xff0c;不一定能在 .NET 7&#xff08;C# 11&#xff09;做完&#xff0c;因此部分内…