在学习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)不太理解,找了些资料,其中一篇博文对元类讲解的比较详细,链接如下:
 
上面的博文比较长,仅就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)的理解的更多相关文章

  1. java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解

    synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized ...

  2. 64.root object的理解

    一.root object的理解     就是某个type对应的mapping json,包括properties,metadata(_id,_source,_type),settings(analy ...

  3. Tree - Gradient Boosting Machine with sklearn source code

    This is the second post in Boosting algorithm. In the previous post, we go through the earliest Boos ...

  4. Python面象对象与类

    # -*- coding: utf-8 -*- # @Date: 2017-08-26 # @Original: from collections import namedtuple from col ...

  5. C#开发微信门户及应用(31)--微信语义理解接口的实现和处理

    微信语义理解接口提供从用户自然语言输入到结构化解析的技术实现,使用先进的自然语言处理技术给开发者提供一站式的语义解析方案.该平台覆盖多个垂直领域的语义场景,部分领域还可以支持取得最终的展示结果.开发者 ...

  6. .NET面试题系列[13] - LINQ to Object

    .NET面试题系列目录 名言警句 "C# 3.0所有特性的提出都是更好地为LINQ服务的" - Learning Hard LINQ是Language Integrated Que ...

  7. $.extend() 或 jQuery.extend() 与 $.fn.Xxx 或 jQuery.fn.extend(object) 之jQuery插件开发

    jQuery为开发插件提拱了两个方法 语法现象1:$.extend() 或 jQuery.extend() 或 jQuery.extend(object)//可以理解为为jQuery类添加类方法或静态 ...

  8. 对于js原型和原型链继承的简单理解(第一种,原型链继承)

    原型是js中的难点加重点,也是前端面试官最爱问的问题之一,因为面试官可以通过被面试者对原型的理解.来判断被面试者对js的熟悉程度. 原型的定义 Js所有的函数都有一个prototype属性,这个属性引 ...

  9. 深入理解javascript new的机制

    我们在使用对象的时候,除了一些浏览器内置的单体对象可以直接使用外,都会new一个出来使用. 1.最简单的莫过于如下获取一个Object对象实例 var obj = new Object(); 说明:此 ...

随机推荐

  1. JAVA学习笔记系列2-Java程序的运行机制

    计算机高级语言的类型主要有编译型和解释型两种,而java语言是两种类型的结合. java首先利用文本编辑器编写java源程序,源文件后缀名为.java,再利用编译器(javac)将源程序编译成字节码文 ...

  2. VC++封装的时间类

    一.使用方法 首先要在工程中加入TimeNow.cpp和TimeNow.h文件 1.把.cpp与.h文件放在放在工程文件夹. 2.项目(progect)-->属性(properties)--&g ...

  3. case语法

    一.文件系统访问列表 FACL :Filesystem Access Control List    文件系统访问列表 利用文件扩展保存额外的访问控制权限. setfacl: -m:设定访问控制权限  ...

  4. java学习笔记37(sql工具类:JDBCUtils)

    在之前的内容中,我们发现,当我们执行一条语句时,每新建一个方法,就要重新连接一次数据库,代码重复率很高,那么能不能把这些重复代码封装成一个类呢,我们学习方法时,就学习到方法就是为了提高代码的利用率,所 ...

  5. Add和AddRange的使用

    Add 是每次将单个元素添加到集合里面 AddRange可以一次性添加多个元素到集合里面 AddRange例子:         public static int ExecuteCommand(st ...

  6. Oracle使用笔记(三)

    在使用oracle过程中,总会遇到用户锁定,密码失效等问题,对于这些问题,总结了以下经验: 一.用户被锁定原因及解锁 对于用户被锁定,有以下几种原因: 1.密码过期: Oracle数据库的用户密码有效 ...

  7. SQL-索引-012

    什么是索引?

  8. 《Linux内核原理与分析》第七周作业

    课本:第六章 进程的描述和进程的创建 操作系统内核实现操作系统的三大管理功能 进程管理 内存管理 文件系统 在操作系统原理中,通过进程控制块PCB描述进程:在Linux内核中,通过一个数据结构stru ...

  9. 推荐一些关于学习Html Css和Js的书吗?

    前端易学易懂,随着移动互联网的日益兴起,it行业对于前端的需求也在不断的提高,那么从前端小白修炼成为前端大神的这个过程之中,一些必备的枕边书也是必不可少的. 第一本,入门<Head first ...

  10. Laravel 5.5处理 Emoji 表情不顯示問題

    服务器环境:PHP7 + MySQL5.6 + Laravel 5.5 項目有個玩樂日誌功能,添加玩樂日誌有富文本輸入,富文本輸入的內容在emoji表情之後被截斷了,沒保存到數據表,排查是對應字段字符 ...