在学习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. 过滤函数 filter

    filter(lambda x:x.endswith('居'),house_type_list) 过滤函数,作用就是将“以‘居’结尾的字段都过滤出来,其它的字段都删除掉.”

  2. 微信连wifi,中文ssid报Invalid sign tosign错误

    Invalid sign tosign错误如上: 是微信官方接受和回传的问题,改固定字符解决: 比如将ssid固定修改为字符串‘ssid’即可:

  3. leetcode 388.Lonest Absolute File Path

    要求寻找的是最长的长度的,那么考虑文件夹和文件的存在的不同形式的,利用当前所存在的层数和对应的长度之间做一个映射关系的并且用于计算总的长度关系的. class Solution { public: i ...

  4. 2018.4.25 github创建新项目

    echo "# IntegrateDemo" >> README.md git init git add README.md git commit -m "f ...

  5. maven编译错误maven-assembly-plugin:2.2-beta-5:assembly (default-cli) on project

    maven对项目编译时报错 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.2-beta ...

  6. psql备份和恢复(ubuntu)

    备份 sudo pg_dump -U  username  -f  filename.sql  dbname 恢复 psql -U username -f filename.sql dbname -- ...

  7. kali 2018.2版本运行破解版burpsuite时候的问题。

    最近重装了kali虚拟机,装完之后把burp拷到里面发现运行不了了,折腾了下才解决,问题主要是由于java环境造成的. 系统默认是以java10运行burp的,但是java10好像是不支持    -X ...

  8. 好久没考虑过的 sql 注入

    很多年没考虑 sql 注入了,毕业以后 使用mybatis #{ 参数的 语法 },这个 语法已经 做了防止 sql 注入的处理 . 看到同事写的 ${ 参数 },突然 想到这个问题 . 下面聊聊 s ...

  9. Linux之ls

    命令功能: ls是list的简写,列出目录下的内容 命令格式: ls [OPTION]... [FILE]... 命令参数: -a,--all    不忽略以“.”开头的隐藏文件 -A, --almo ...

  10. [UE4]添加手柄

    一.在上一节的VRPawnBase中,再添加2个Motion Controller,分别命名为:LeftMotionController.RightMotionController,分别代表左右手柄. ...