Python-元类 单例
2.元类
用于创建类的类 叫元类 默认元类都是type
主要控制类的创建__init__ 类的实例化__call__ 3.单例
一个类只有一个实例
什么时候用,大家公用一个打印机,没有必要每个人创建新的打印机对象 共用一个对象即可 =============================== 元类是什么?
源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的
本质上元类也是一个类,元类是用于实例化其他类 class Dog:
def __init__(self):
print("狗初始化了")
color = "red"
def talk(self):
print("狗在叫!")
d1 = Dog()
# print(Dog.__dict__) # 查看对象时哪个类实例化出来的
print(d1.__class__) #<class '__main__.Dog'>
print(Dog.__class__) #<class 'type'>
print(type(d1)) #<class '__main__.Dog'>
print(type(Dog)) #<class 'type'> # 一个类必须具备的内容
1.类名
2.基类
3.名称空间 #通过查看__class__ 发现 Dog对象 是由type类示例化得来
#既然如此 是不是可以手动调用type来实例化 class_name = "Pig"
bases = (object,)
pic_dict = {}
class_body = """
def __init__(self):
print("猪初始化了") color = "red" def talk(self):
print("猪在叫!")
"""
# 执行一堆字符串代码 将生产的内容放到pic_dict中
exec(class_body,{},pic_dict)
print(pic_dict)
# 调用type产生一个类
c = type(class_name,bases,pic_dict)
print(c) #<class '__main__.Pig'>
print(Dog) #<class '__main__.Dog'>
"""
默认情况下 所有的类都是通过type这个元类示例化的
我们完全可以自己来实例化
元类的作用?
用于创建类的类 称为元类
"""
# 控制类的创建过程 核心函数就是元类中的init函数
# 1.控制类的调用
# 2.单例设计模式 # 调用一个类的创建 创建出一个空对象,调用__init__来完成对象的初始化,返回该对象
# 控制类的调用 也就是实例化过程 核心函数 元类中的__call__
# 需要注意的是,在__call__中应当先完成基础的逻辑
1.创建空对象,2.执行__init__ 3.返回新对象
# 在此基础上添加额外的业务逻辑 单例
是一种设计模式
是设计模式中比较简单的
指的是 一个类有且仅有一个实例 就叫单例 实现单例 就通过判断是否已经创建过对象 为什么要使用单例这种模式
之前在创建对象时 每个对象中的数据不相同 对象实际上数据和处理数据的方法的结合体
当对象中的数据是 相同的 共享的 时候 使用单例 u1 = user("张三",29,"man")
u2 = user("张三",29,"man")
u3 = user("张三",29,"man")
不同的对象 有完全相同的数据 没有必要每个人保存一份 u1 = user("张三",29,"man")
u2 = u1
u3 = u1
如此 可以减少资源开销 大家共享一个数据 只有一个对象 单例模板!!!
class MyMetaClass(type): instance = None
def __call__(cls, *args, **kwargs):
if not MyMetaClass.instance:
# 创建空对象
MyMetaClass.instance = object.__new__(cls)
print("创建新的播放器对象!")
#初始化对象
MyMetaClass.instance.__init__(*args,**kwargs)
# 返回对象
return MyMetaClass.instance # 只能有一个播放器实例
class CDPlayer(metaclass=MyMetaClass):
def play(self,music):
print("切换音乐",music)
def __init__(self,music_name):
self.music_name = music_name p1 = CDPlayer("你发如雪!")
p1.play("菊花台")
p1.play("菊花台2")
p1.play("菊花台3") # 不会创建新对象
p1 = CDPlayer("你发如雪!")
p1 = CDPlayer("你发如雪!")
p1 = CDPlayer("你发如雪!")
p1 = CDPlayer("你发如雪!") # 元类实现单例 就是拦截了元类中的__call__的正常执行 使得创建对象都必须经过自己判断逻辑
Python-元类 单例的更多相关文章
- 29 内置方法 eval | exec 元类 单例
eval与exec内置方法 将字符串作为执行目标,得到响应结果 eval常用作类型转换:该函数执行完有返回值 exec拥有执行更复杂的字符串:可以形成名称空间 eval内置函数的使用场景: 1.执 ...
- Python中的单例设计
01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保 ...
- Python 元类 - Metaclasses
Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...
- python元类:type和metaclass
python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...
- java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作
ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- python中的单例
使用__new__ 因为一个类每一次实例化的时候,都会走它的__new__方法.所以我们可以使用__new__来控制实例的创建过程,代码如下: class Single: instance = Non ...
- 转--python 中写单例
原文地址 原文地址2 Python中的单例模式的几种实现方式的及优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法 ...
- Python元类(metaclass)以及元类实现单例模式
这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解类也是对 ...
随机推荐
- 硬盘读取速度变慢 — 当前传送模式: PIO模式
网上搜索了一下,找到两篇文章: 标题:硬盘读取速度变慢 当前传输模式pio的解决方法 http://www.veryhuo.com/a/view/52786.html (解决思路:先卸载驱动,重启 ...
- swap(十六)
a = 12 b = 33 a,b=b,a print(a,b)
- The 2016 ACM-ICPC Asia Beijing Regional Contest E - What a Ridiculous Election
https://vjudge.net/contest/259447#problem/E bfs,k个限制条件以数组的额外k维呈现. #include <bits/stdc++.h> usi ...
- EOJ2018.10 月赛(B 数学+思维题)
传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9739115.html 题意: 找到最小的包含子序列a的序列s,并且序列s是 p -莫干山序 ...
- k8s技术--Kubernetes集群kubectl命令的常见使用方法
简介:kubectl是一个命令行界面,用于运行针对Kubernetes群集的命令. 语法: kubectl [command] [TYPE] [NAME] [flags] command:指定您希望对 ...
- CSS3:文字属性
文字属性注意的细节: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 即将上线的flume服务器面临的一系列填坑笔记
即将上线的flume服务器面临的一系列填坑笔记 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.flume缺少依赖包导致启动失败! 报错信息如下: 2018-10-17 ...
- dubbo面试问题
为什么用微服务: 为什么zookeeper能作为注册中心: 使用分布式碰到的bug, zookeeper有集群吗?怎么实现的: zookeeper宕机还能访问吗: 服务失效踢出zookeeper中临时 ...
- Calendar 日历类的时间操作
我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年....某些网站会记录下用户登陆的时间,比如银行的一些网站,对于这些经常需要处理的问题,Java中提供 ...
- CodeForces - 516B Drazil and Tiles(bfs)
https://vjudge.net/problem/CodeForces-516B 题意 在一个n*m图中放1*2或者2*1的长方形,问是否存在唯一的方法填满图中的‘.’ 分析 如果要有唯一的方案, ...