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-元类 单例的更多相关文章

  1. 29 内置方法 eval | exec 元类 单例

    eval与exec内置方法 将字符串作为执行目标,得到响应结果 eval常用作类型转换:该函数执行完有返回值 exec拥有执行更复杂的字符串:可以形成名称空间 eval内置函数的使用场景:   1.执 ...

  2. Python中的单例设计

    01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保 ...

  3. Python 元类 - Metaclasses

    Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...

  4. python元类:type和metaclass

    python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...

  5. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  6. Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

  7. python中的单例

    使用__new__ 因为一个类每一次实例化的时候,都会走它的__new__方法.所以我们可以使用__new__来控制实例的创建过程,代码如下: class Single: instance = Non ...

  8. 转--python 中写单例

    原文地址 原文地址2 Python中的单例模式的几种实现方式的及优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法 ...

  9. Python元类(metaclass)以及元类实现单例模式

    这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解类也是对 ...

随机推荐

  1. (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署

    背景:最近项目组在开发本地缓存,其中用到了redis和ehcache,但是在使用注解过程中发现两者会出现冲突,这里给出解决两者冲突的具体方案. spring-ehcache.xml配置: <?x ...

  2. 出现“java.lang.AssertionError: SAM dictionaries are not the same”报错

    运行一下程序时出现“java.lang.AssertionError: SAM dictionaries are not the same”报错 java -jar picard.jar SortVc ...

  3. Xshell配置是vi显示多种颜色

    在链接中,点 File菜单——properties   或按快捷键 alt+p 第一步: Properties--->Terminal 右边的窗口中,将Terminal Type 选择为linu ...

  4. Saltstack windows可视化操作(十四)

    在windows下通过Salt-Minion-xxxx.xx.x-AMD64-Setup.exe安装salt-minion的时候,默认是安装并开机启动salt-minion服务.但是如果以服务的方式启 ...

  5. 远程升级云服务器系统 CentOS 6.x 至 CentOS 7.x

    由于docker-ce不再支持centos6,所以觉得吧系统升级为centos7,以下是踩坑的过程 1.添加源 /etc/yum.repos.d/upgrade.repo [upgrade] name ...

  6. Spark记录-Spark性能优化解决方案

    Spark性能优化的10大问题及其解决方案 问题1:reduce task数目不合适解决方式:需根据实际情况调节默认配置,调整方式是修改参数spark.default.parallelism.通常,r ...

  7. 构建eureka-server异常ClassNotFoundException: org.springframework.boot.context.embedded.FilterRegistrationBean

    Caused by: java.lang.ClassNotFoundException: org.springframework.boot.context.embedded.FilterRegistr ...

  8. spring tool suite处理 maven项目名称红色感叹号的问题

    今天构建一个springboot项目时,发现项目有个红色感叹号,但是pom.xml跟Build Path 都没问题. 解决方案: 选择 Windows --> show view --> ...

  9. RocketMQ之消息幂等

    幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中. 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同. 首先我们了解一下什么是 ...

  10. Python学习笔记9-多线程和多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...