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. JSON必知必会,浅尝辄止的整理

    在使用JSON时常见的安全漏洞通常发生在JavaScript从服务器获取到一段JSON字符串并将其转化为JavaScript对象时, 在定位JSON安全问题时,应该记住三件事情: 1.不要使用顶级数组 ...

  2. NOIP 普及组 2016 回文日期

    传送门 https://www.cnblogs.com/violet-acmer/p/9859003.html 题解: 思路1: 相关变量解释: year1,month1,day1 : date1对应 ...

  3. springboot的跨域

    https://www.cnblogs.com/520playboy/p/7306008.html 1.对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出 ...

  4. 51job_selenium测试

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  5. #define宏定义中## #@ # \ 符号使用

    C/C++ 宏命令的神奇用法. 先看下面三条语句: #define Conn(x,y)     x##y#define ToChar(x)     #@x#define ToString(x)    ...

  6. 用jsch.jar实现SFTP上传下载删除【转】【补】

    java类: 需要引用的jar: jsch-0.1.53.jar 关于jsch有篇文章关于目录的问题写得非常好:http://www.zzzyk.com/show/9f02969327434a6c.h ...

  7. Thread的setDaemon(true)方法

    定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开.优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务. 设置:通过setDaemon(true)来设置线程为“守护 ...

  8. java抽象类与接口回顾

    1.抽象类中可以包括成员变量,方法,构造器,初始化块,内部类(接口/枚举)五种成分.2.让A类中包含B方法,又不提供B方法的实现,即抽象方法只有方法签名,没有方法体.3.有抽象方法的类只能被定义成抽象 ...

  9. 10-SQL Server 2008 R2安装步骤

    一.  软件和环境 1.  软件 : SQL Server 2008 R2 企业版     软件下载地址:XXXX 2.  环境要求: .Net FrameWork 3.5 以上 (windows 7 ...

  10. js中常用事件

    鼠标事件 /* onclick:点击某个对象时触发 ondblclick:双击某个对象时触发 onmouseover:鼠标移入某个元素时触发 onmouseout:鼠标移出某个元素时触发 onmous ...