python中使用元类

type()

python中函数和类的定义,不是编译时定义的,而是运行时动态创建的。

比如定义一个class,写法一:

class Toodo(object):
    def fun(self, msg="toodo.fun"):
        print(msg)

写法二:

def fun(self, msg="toodo.fun"):
    print(msg)
Toodo = type("Toodo", (object,), dict(fun=fun))

其中,type函数一次传入3个参数:

  1. class的名称
  2. 继承的父类集合,支持多重继承,如果只有一个父类,使用tuple的单例写法
  3. class中的方法名称与函数进行绑定,传入一个字典
toodo = Toodo()
toodo.fun()
print(type(Toodo))
>>> <class 'type'>
print(type(toodo))
>>> <class '__main__.Toodo'>

打印上面两种方法创建的Toodo类都会得到这个结果,由此可见,通过写法二的type()函数创建的类和写法一通过class是完全相同的,因为python解释器遇到class关键词时,仅扫描class中定义的内容,然后通过type()函数创建出class。

metaclass

metaclass可以控制类的创建行为,先定义metaclass,就可以创建类,然后创建实例,如:

class MyMetaclass(type):
    def __new__(mcs, name, bases, attrs):
        attrs["fun"] = lambda self: print("toodo.fun")
        return type.__new__(mcs, name, bases, attrs)


class Toodo(metaclass=MyMetaclass):
    pass

在创建类时,通过指定元类(格式为metaclass=元类名),当Python解释器在创建Toodo类时,Mymetaclass元类中的__new__方法就会被调用,从而动态添加了fun这个类方法。

new()方法接收到的参数依次是:

  1. 当前准备创建的类的对象
  2. 类的名字
  3. 类继承的父类集合
  4. 类的方法集合

可以测试以下Toodo是否可以调用fun()方法:

toodo = Toodo()
toodo.fun()
>>> toodo.fun

下面是我自己运营的微信小程序“但行趣事”和公众号“微电脑”,更多的技术文章以及视频我会放到小程序和公众号当中,有志同道合的小伙伴也可以在小程序(联系客服按钮)或者公众号(直接留言)当中联系我们

但行趣事小程序
微电脑公众号
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我雯子小姐的小爷

是雯子吖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值