【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__()
时间: 2024-10-09 23:35:02

【Python】【元编程】【三】【元类】的相关文章

python高级编程之(类级):子类内建类型

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一(请访问:https://www.python.org/download/releases/2.2.3/descintro(可能已经不存在了))-这使内建类型的子类化成为可能,并且添加一个新内建类型object #用于所有内建类的公共祖先 #展示一个名为distinctdict类的代码,与平常的dic

python高级编程之元类(第3部分结束)

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元编程 #new-style类带来了一种能力,通过2个特殊方法(__new__和__metaclass__)在运行时修改类和对象的定义 #__new__方法 #它是一上元构建程序,每次一个对象被factor类实例化时就调用它 #例如: class A(object): def __new__(cls,): print '__new__' return object

python之元编程(元类实例)

本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保存到对应的父类元组的childrens的集合中. 同时对__str__打印方法和__iter__迭代方法进行了定义,其中: __iter__方法返回类名的childrens集合,并对其中的元素进行输入. 而Sharp继承自RegisterClasses, 当 for s in Sharp: prin

python 面向对象编程 之 元类

元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板 四步走: 一:控制class定义类的过程 1.先拿到类名 2.在拿到基类 3.执行类体代码,得到名称空间的dict 4.调用元类将三个参数传递进去 #其实class 是上面四步的封装.(隔离了复杂度) 二:自定义元类 class Mymeta(type): def __init__(self,class_name,class_base,class_dic): super().__init__(class_name,

c++模板元编程三:循环展开

2.2 loop unrolling 循环展开 前面enum一节介绍的是和template联合,引发编译器递归的奇妙作用.template本身无需enum配合也可以达到递归的效果. // test template recursive for loop unrolling cout << "test 2: template recursive for loop unrolling" << endl; for (size_t i = 0; i < 8; ++

Python核心编程笔记(类)

Python并不强求你以面向对象的方式编程(与Java不同) # coding=utf8 class FooClass(object): version = 0.1 def __init__(self, nm='John Doe'): self.name = nm print('Created a class instance for', nm) def showname(self): print('Your name is ', self.name) print('My name is ',

python面向对象编程基础II(类的继承)

继承一个类 继承的好处: 1.复用已有代码 2.自动拥有现有类的所有功能 3.只需要编写缺少的功能 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender 定义Student类时,只需要把额外的属性加上,例如score: class Student(Pers

Python网络编程 (三)使用select.select()实现聊天服务器

第一步, 实现通用的send()和receive()函数: send函数定义通过cPicle.dumps()将需要发送的数据序列化,然后通过socket.htonl()方法将序列化后的数据长度转化为网络字节序格式,以便于底层传输,再将网络字节序格式的长度打包为'L'类型的C struct, 最后发送打包后的长度以及序列化后的数据 receive函数即是send反向过程,先接收到打包后的长度,将其解包,然后再主机序列化,所有数据接收完成以后,返回解除序列化后的原始数据. 1 def send(ch

python网络编程三次握手和四次挥手

TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的连接.[1] TCP三次握手的过程如下: 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态. 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进

Python并发编程—自定义线程类

自定义线程类 1.创建步骤[1] 继承Thread类[2] 重写__init__方法添加自己的属性,使用super加载父类属性[3] 重写run方法 2.使用方法[1] 实例化对象[2] 调用start自动执行run方法[3] 调用join回收线程 1 from threading import Thread 2 from time import sleep, ctime 3 4 5 class MyThread(Thread): 6 def __init__(self, target=None