分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

关于six.with_metaclass(ABCMeta, object)的理解

发布时间:2023-09-06 01:59责任编辑:林大明关键词:classmeta
在学习Python过程中,看到了生成虚基类的方式,
class PeopleBase(six.with_metaclass(ABCMeta, object)): ???@abstractmethod ???def work(self, *args, **kwargs): ???????#pass为空语句,占位用 ???????pass ???@abstractmethod ???def live(self, *args, **kwargs): ???????pass
对于six.with_metaclass(ABCMeta, object)不太理解,找了些资料,其中一篇博文对元类讲解的比较详细,链接如下:
Python中的元类(译):https://www.cnblogs.com/ajianbeyourself/p/4052084.html
 
上面的博文比较长,仅就six.with_metaclass(ABCMeta, object)相关的内容,做一点笔记
 
元类就是创建类的类,在Python中,只有type类及其子类才可以当元类,
type创建类时,参数格式:type(classname, parentclasses , attrs),classname是类名,字符串类型,parentclasses是类的所有父类,元组类型,attrs是类的所有{属性:值},是字典类型
一切类的创建最终都会调用type.__new__(cls, classname, bases, attrs),它会在堆中创建一个类对象,并返回该对象
当通过type.__new__(cls, classname, bases, attrs)创建类时,cls就是该类的元类,它是type类或其子类。
 
ABCMeta是一个抽象类的元类,用来创建抽象类基类:Metaclass for defining Abstract Base Classes (ABCs).
six.with_metaclass是用元类来创建类的方法,调用一个内部类,在内部类的__new__函数中,返回一个新创建的临时类
def with_metaclass(meta, *bases): ???"""Create a base class with a metaclass.""" ???# This requires a bit of explanation: the basic idea is to make a dummy ???# metaclass for one level of class instantiation that replaces itself with ???# the actual metaclass. ???class metaclass(type): ???????def __new__(cls, name, this_bases, d): ???????????return meta(name, bases, d) ???????@classmethod ???????def __prepare__(cls, name, this_bases): ???????????return meta.__prepare__(name, bases) ???return type.__new__(metaclass, ‘temporary_class‘, (), {})
six.with_metaclass(ABCMeta, object)就通过内部类的__new__函数返回一个ABCMeta元类创建的临时类,作为PeopleBase类的基类
在python里类也是对象,下面两个语句可以看PeopleBase类的类型,都是<class ‘abc.ABCMeta‘>,即PeopleBase类是ABCMeta元类的对象,是由ABCMeta元类生成的。
print(type(PeopleBase))print(PeopleBase.__class__)#<class ‘abc.ABCMeta‘>#<class ‘abc.ABCMeta‘>

关于six.with_metaclass(ABCMeta, object)的理解

原文地址:https://www.cnblogs.com/zhaoshizi/p/9180886.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved