举例讲解Python中metaclass元类的创建与使用


Posted in Python onJune 30, 2016

元类是可以让你定义某些类是如何被创建的。从根本上说,赋予你如何创建类的控制权。
元类也是一个类,是一个type类。
 
元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类,如果此属性没有定义,它会向上查找父类中的__metaclass__属性。如果还没发现,就查找全局变量。
 
对于传统类来说,它们的元类是types.ClassType。
 
元类也有构造器,传递三个参数:类名,从基类继承数据的元组,和类属性字典。
下面我们来定义一个元类,要求写类的时候必须给类提供一个__str__()方法,如果没有提供__repr__()方法,
则给你警告。

from warnings import warn
#元类需要继承type类
class ReqStrSugRepr(type):
  def __init__(cls, name, bases, attrd):
  #构造函数需要传递的参数为类名,基类,类属性字典
    super(ReqStrSugRepr, cls).__init__(name, bases, attrd)
    # 判断__str__字符串是否在类的属性字典里
    if '__str__' not in attrd:
      raise TypeError('Class requires overriding of __str__()')

    if '__repr__' not in attrd:
      warn('Class suggests overriding of __repr__()\n', stacklevel=3)

class Foo(object):
  #给类指定元类 
  __metaclass__ = ReqStrSugRepr

  def foo(self):
    pass
#这一段代码不用创建类来测试,直接运行一下就会报错,可见元类的功力。

举例讲解Python中metaclass元类的创建与使用

type

type函数可以查看一个变量的类型, 比如:

# <type 'int'>
# <type 'str'>
type(1)     
type('mink')

type函数还可以创建一个新的对象
type接受三个参数,name, bases, dict 第一个接受类名,第二个参数接受父类(元组形式),第三个参数接受属性和方法(字典形式)

X = type('X', (object,), dict(a=1))
# 等于
class X(object):
  a = 1

下面是接受函数的方法

def say(self):
  print 'hello'

X = type('X', (object,), dict(say=say))
x = X()

# pirnt hello
x.say()

元类

我们都知道通过类可以创建处实例对象,而元类就是创建出类对象的类。type可以创建出类对象也就是说type就是一个元类。

metaclass 属性

如果想使用元类创建类对象就需要对该对象添加一个__metaclass__属性。当然你首先得有一个元类

class PrivateMetaclass(type):
  def __new__(cls, name, parents, attrs):
    attrs = dict(('__%s' % k, v) for k, v in attrs.itmes())
    return super(PrivateMetaclass, cls).__new__(cls, name, parents, attrs)

class A(object):
  __metaclass__ = PrivateMetaclass
  a = 1
  b = 2

a = A()
# raise AttributeError
print a.a, a.b 

# print 1, 2
print a.__a, a.__b

这样你就可以通过元类来修改类的一些特性,上面的就是修改变量为私有变量.

Python 相关文章推荐
Python splitlines使用技巧
Sep 06 Python
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
python绘制规则网络图形实例
Dec 09 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
keras的三种模型实现与区别说明
Jul 03 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
在Python中定义和使用抽象类的方法
Jun 30 #Python
Python中functools模块的常用函数解析
Jun 30 #Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 #Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 #Python
django之常用命令详解
Jun 30 #Python
全面了解Python环境配置及项目建立
Jun 30 #Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 #Python
You might like
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
python dumps和loads区别详解
2020/02/04 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
文明城市标语
2014/06/16 职场文书
开服装店计划书
2014/08/15 职场文书
秋冬农业生产标语
2014/10/09 职场文书
2014年度培训工作总结
2014/11/27 职场文书