python元类单例_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__) #

print(Dog.__class__) #

print(type(d1)) #

print(type(Dog)) #

# 一个类必须具备的内容

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) #

print(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__的正常执行 使得创建对象都必须经过自己判断逻辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值