博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
廖雪峰Python学习笔记——使用元类
阅读量:5346 次
发布时间:2019-06-15

本文共 1354 字,大约阅读时间需要 4 分钟。

元类(MetaClasses)

元类提供了一个改变Python类行为的有效方式。

元类的定义是“一个类的类”。任何实例是它自己的类都是元类。

class demo(object): pass obj = demo() print "Class of obj is {0}".format(obj.__class__) print "Class of obj is {0}".format(demo.__class__) # Class of obj is 
# Class of obj is

在上例中,我们定义了一个类demo,并且生成了一个该类的对象obj。首先,可以看到obj的__class__是demo。有意思的来了,那么demo的class又是什么呢?可以看到demo的__class__是type。

所以说type是python类的类,换句话说,上例中的obj是一个demo的对象,而demo本身又是type的一个对象。

所以说type就是一个元类,而且是python中最常见的元类,因为它使python中所有类的默认元类。

因为元类是类的类,所以它被用来创建类(正如类是被用来创建对象的一样)。但是,难道我们不是通过一个标准的类定义来创建类的么?的确是这样,但是python内部的运作机制如下:

    • 当看见一个类定义,python会收集所有属性到一个字典中。
    • 当类定义结束,python将决定类的元类,我们就称它为Meta吧。
    • 最后,python执行Meta(name, bases, dct),其中:

a. Meta是元类,所以这个调用是实例化它。

b. name是新建类的类名。
c. bases是新建类的基类元组
d. dct将属性名映射到对象,列出所有的类属性。

那么如何确定一个类(A)的元类呢?简单来说,如果一个类(A)自身或其基类(Base_A)之一有__metaclass__属性存在,则这个类(A/Base_A)就是类(A)的元类。否则type就将是类(A)的元类。

 

 

 metaclass 原理

metaclass的原理其实是这样的:当定义好类之后,创建类的时候其实是调用了type的__new__方法为这个类分配内存空间,创建

好了之后再调用type的__init__方法初始化(做一些赋值等)。所以metaclass的所有magic其实就在于这个__new__方法里面了。

说说这个方法:__new__(cls, name, bases, attrs)

cls: 将要创建的类,类似与self,但是self指向的是instance,而这里cls指向的是class

name: 类的名字,也就是我们通常用类名.__name__获取的。

bases: 基类

attrs: 属性的dict。dict的内容可以是变量(类属性),也可以是函数(类方法)。

 

所以在创建类的过程,我们可以在这个函数里面修改name,bases,attrs的值来自由的达到我们的功能。这里常用的配合方法是

getattr和setattr(just an advice)

转载于:https://www.cnblogs.com/IcarusYu/p/7462420.html

你可能感兴趣的文章
【Python之路Day1】基础篇
查看>>
wordpress stratus模板使用 产品显示问题
查看>>
第一课:网络爬虫准备
查看>>
IE8 input X 去掉文本框的叉叉和密码输入框的眼睛图标
查看>>
C#内联汇编的一个类
查看>>
AFNetworking 显示不支持“Content-Type:text/plain”的解决方法
查看>>
[WPF] 将普通的Library工程,改造成WPF Custom Control 的Library
查看>>
2019春第十一周作业
查看>>
深入浅出SharePoint——无法搜索当前站点的数据
查看>>
js的线程和同步异步以及console.log机制
查看>>
JavaScript 框架比较
查看>>
前端资源大整理
查看>>
CF815D Karen and Cards 官方题解翻译
查看>>
状态压缩的一些常用东西
查看>>
ue4 shooterGame 第一步 搭建git linux服务器
查看>>
下载类.....
查看>>
正则表达式30分钟入门教程
查看>>
Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum
查看>>
OpenGL使用libPng读取png图片
查看>>
根据2个经纬度点,计算这2个经纬度点之间的距离(通过经度纬度得到距离)
查看>>