【Python】【元编程】【三】【元类】
'''
# str、 type 和 LineItem 是object 的子类 str、 object 和 LineItem 是 type 的实例,因为它们都是类
object 类和 type 类之间的关系很独特: object 是 type 的实例,而 type
是 object 的子类。这种关系很“神奇”,无法使用 Python 代码表述,因为定义其中一
个之前另一个必须存在。 type 是自身的实例这一点也很神奇
>>> 'spam'.__class__
<class 'str'>
>>> str.__class__
<class 'type'>
>>> from bulkfood_v6 import LineItem
>>> LineItem.__class__
<class 'type'>
>>> type.__class__
<class 'type'>
''' '''
ABCMeta 最终所属的类也是 type。所有类都直接或间接地是 type 的实例,
不过只有元类同时也是 type 的子类。若想理解元类,一定要知道这种关系:元类(如
ABCMeta)从 type 类继承了构建类的能力
>>> import collections
>>> collections.Iterable.__class__
<class 'abc.ABCMeta'>
>>> import abc
>>> abc.ABCMeta.__class__
<class 'type'>
>>> abc.ABCMeta.__mro__
(<class 'abc.ABCMeta'>, <class 'type'>, <class 'object'>)
Iterable 是 object 的子类,是 ABCMeta 的实例。 object 和 ABCMeta 都是
type 的实例,但是这里的重要关系是, ABCMeta 还是 type 的子类,因为 ABCMeta 是
元类。示意图中只有 Iterable 是抽象类
我们要抓住的重点是,所有类都是 type 的实例,但是元类还是 type 的子类,因此可以
作为制造类的工厂。具体来说,元类可以通过实现 __init__ 方法定制实例。元类的
__init__ 方法可以做到类装饰器能做的任何事情,但是作用更大,如接下来的练习所
示。
''' #构建顺序:元类__prepare__() -> __new__() -> __init__()
【Python】【元编程】【三】【元类】的更多相关文章
- python高级编程之元类(第3部分结束)
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元编程 #new-style类带来了一种能力,通过2个特殊方法(_ ...
- python高级编程之(类级):子类内建类型
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一( ...
- python之元编程(元类实例)
本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保 ...
- python 面向对象编程 之 元类
元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板 四步走: 一:控制class定义类的过程 1.先拿到类名 2.在拿到基类 3.执行类体代码,得到名称空间的dict 4 ...
- Python核心编程笔记(类)
Python并不强求你以面向对象的方式编程(与Java不同) # coding=utf8 class FooClass(object): version = 0.1 def __init__(self ...
- Python学习笔记【第十五篇】:Python网络编程三ftp案例练习--断点续传
开发一个支持多用户在线的FTP程序-------------------主要是学习思路 实现功能点 1:用户登陆验证(用户名.密码) 2:实现多用户登陆 3:实现简单的cmd命令操作 4:文件的上传( ...
- python基础(三)——类的研究
class Employee: //定义类 以冒号结束 '所有员工的基类' //帮助信息 empCount = 0 def __init__(self, name, salary): //调用时初始化 ...
- python网络编程三次握手和四次挥手
TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的 ...
- Python并行编程(三):线程同步之Lock
1.基础概念 当两个或以上对共享内存操作的并发线程中,如果有一个改变数据,又没有同步机制的条件下,就会产生竞争条件,可能会导致执行无效代码.bug等异常行为. 竞争条件最简单的解决方法是使用锁.锁的操 ...
- C++值元编程
--永远不要在OJ上使用值元编程,过于简单的没有优势,能有优势的编译错误. 背景 2019年10月,我在学习算法.有一道作业题,输入规模很小,可以用打表法解决.具体方案有以下三种: 运行时预处理,生成 ...
随机推荐
- python安装HTMLTestRunner
== https://pypi.org/project/html-testRunner/#files 下载 放在这路径下 cmd中进行安装
- python-计算器实现
# 开发一个简单的python计算器# 实现加减乘除及括号优先级解析# 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...
- mysql主从延迟(摘自http://www.linuxidc.com/Linux/2012-02/53995.htm)
http://www.linuxidc.com/Linux/2012-02/53995.htm
- css+table
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- CHM无法正常显示的问题
很喜欢看CHM电子书,感觉篇幅不是很长,而且可以索引:但是昨天遇到这个问题: 打开文件的时候发现: 很喜欢看CHM电子书,感觉篇幅不是很长,而且可以索引:但是昨天遇到这个问题: 打开文件的时候发现: ...
- Java面向对象---接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口 ...
- [转载]C#操作符??和?:
先看如下代码: string strParam = Request.Params["param"]; if ( strParam== null ) { strParam= ...
- 计算概论(A)/基础编程练习1(8题)/4:求一元二次方程的根
#include<stdio.h> #include<math.h> int main() { // 待解方程数目 int n; scanf("%d", & ...
- live555 编译
项目里面需要简单的rtsp服务器来实现视频预览等功能: rtsp本来不是太复杂的东西,github上有很多功能都比较完善的项目可以随便拿来用,但是测试过程中发现live555还是有性能上的一些差异: ...
- SNMP学习笔记之SNMPv3的配置和认证以及TroubleShooting
0x00 增加snmp v3用户 增加用户的时候,必须要停止SNMP服务. # service snmpd stop # net-snmp-config --create-snmpv3-user -r ...