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__方法则是第三行调用的。运行结果
上面的两种用法是相同的
结语
其实元类并没有那么恐怖,理解意思和过程就很清楚了,先浅谈到这里,希望大家有所收获!!!
- 作者:昊色居士
- 链接:https://blog.haose.love//article/51ac33a5-6ed9-411e-9c07-35f109a891f7
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。




