技术分享
Python元类浅谈之单例模式
00 分钟
2022-10-16
2024-6-4
type
status
date
slug
summary
tags
category
icon
password

Python元类浅谈之单例模式

前言

今天来带大家以单例模式为案例,给大家简单的讲解一下Python元类相关的知识。

啥是元类

类的创建

说元类之前先说一下普通类的创建过程,众所周知,类的创建的通过class关键字来进行定义一个类的,然后可以选择继承自其他的类,比如:
但也有另外一种创建类的方式,就是使用type()函数,type()函数有两种用法,我们来看看官方的函数签名:
上面明确的指出了如果只传递一个参数,就是走的 type(object)方法,作用是反正对象的类型,如果传递了三个函数则是使用type(name, bases, dict),作用就是创建一个新的类型,也就是类的创建,我们来看看三个参数:
  • name:新类型的名字
  • bases:新类型要继承的类,类型的元组
  • dict:新类型的属性
我们来看一个案例:
我们使用type创建了一个类,类型是A,继承自object类,里面没有属性,然后使用这个A创建了a、b两个对象

元类

由上面可以看到,我们的类A是通过type创建出来的,所以这个type就是类A的元类,也是所有类的默认元类,如果我们要想使用自定义的元类,就使用自己的类替换type就好,先看一下单例模式的例子:
SingletonMeta继承自type,就表示可以作为一个元类来使用,然后__call__方法这里是定义在了元类里面,意思就是每次执行A()的时候会调用的方法,看第一个参数cls,就是使用这个元类的类,也就是A,然后这个类如果不存在元类的类属性_instances中,就保存进去,然后返回这个类的实例

__call____init__区别

看到上面大家可能会有疑问A()不是创建一个对象吗?这个时候不是应该执行__init__方法吗?那哪个会先执行呢?一般情况下大家看到的__call__是定义在普通的类里面的,也就是先实例化一个对象,然后调用对象的方式如:
这样的情况下一定是先执行的__init__方法,然后再每次执行a()的时候再去调用__call__方法,但是这里的__call__方法是定义再元类上面的,上面说了元类的控制类的创建,所以__call__方法就是再类创建成功之后,每次执行A()的时候调用,这个时候类执行A() 的时候__init__方法,只会在第一次的__call__方法执行结束之后调用一次,其他的时候都会只执行__call__方法

__new____init__区别

这里面还有一个很常见的问题:__init__和__new__的区别是啥,__init__是类创建对象的时候去调用的方法,new`则是创建类的时候调用的,就拿手动创建类来说:
__new__方法是第二行调用的,而__init__方法则是第三行调用的。

运行结果

上面的两种用法是相同的

结语

其实元类并没有那么恐怖,理解意思和过程就很清楚了,先浅谈到这里,希望大家有所收获!!!
 
上一篇
Postgresql 导入导出介绍
下一篇
Python处理Float精度问题方案