恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类。

代码如下,这是一个使用了函数做元类传递给类:

input:
def upper_attr(class_name, class_parents, class_attr):
"""
返回一个对象,将属性都改为大写的形式
:param class_name: 类的名称
:param class_parents: 类的父类tuple
:param class_attr: 类的参数
:return: 返回类
"""
# 生成了一个generator
attrs = ((name, value) for name, value in class_attr.items() if not name.startswith('__'))
uppercase_attrs = dict((name.upper(), value) for name, value in attrs)
return type(class_name, class_parents, uppercase_attrs) __metaclass__ = upper_attr pw = upper_attr('Trick', (), {'bar': 0})
print hasattr(pw, 'bar')
print hasattr(pw, 'BAR')
print pw.BAR output:
False
True
0
upper_attr函数用来接收参数:类名,类的父类,类的属性,作用是将传入的类的属性装化成大写,传给type,使用type创建一个类,新的类就拥有属性BAR,而不是bar,这样我们就可以使用元类创建特性的类

type是一个元类,定义一个元类可以继承type(这里不多介绍type)

代码二:

class UpperAttrMetaClass(type):
def __new__(mcs, class_name, class_parents, class_attr):
attrs = ((name, value) for name, value in class_attr.items() if not name.startswith('__'))
uppercase_attrs = dict((name.upper(), value) for name, value in attrs)
return super(UpperAttrMetaClass, mcs).__new__(mcs, class_name, class_parents, uppercase_attrs) class Trick(object):
__metaclass__ = UpperAttrMetaClass
bar = 12
money = 'unlimited' print Trick.BAR
print Trick.MONEY

使用一个正式类来作为元类传递给__metaclass__,作用如上,跟我之前写的那个有点相似,这里创建类的时候有点不一样,是python版本不一样的问题,但都是使用metaclass创建类,metaclass的new方法相当于类创建实例的new方法,一个是为init初始化实例提供实例,一个是初始化类。(注意使用new方法返回时可以使用任意新式类,但不要使用自身。)

最新文章

  1. 安卓奇葩问题之SQLite条件查找不到数据
  2. 烂泥:KVM使用NAT联网并为VM配置iptables端口转发
  3. Axure 全局辅助线(转)
  4. 安装cvxpy遇到的问题与解决方案(ubuntu14.10,python 2.7.8)
  5. Gson简要使用
  6. Android --LoginActivity模板登录
  7. MongoDB Enterprise提供的服务
  8. ububru下 redmine安装教程
  9. bzoj1684 [Usaco2005 Oct]Close Encounter
  10. Repository,UnitOfWork,DbContext(1)
  11. 《CSS设计指南》阅读笔记
  12. Linux用户管理-中
  13. do while 循环和while循环的区别
  14. 初识Scala
  15. Java中的 JDK下载和环境配置(方式一)
  16. docker之数据卷管理
  17. [转]Linux内核源码详解--iostat
  18. 双频无线网安装设置(5g ) for linux
  19. pandas 按照某一列进行排序
  20. scala (2) while 和变量

热门文章

  1. SCADA系统
  2. 芝麻HTTP:在无GUI的CentOS上使用Selenium+Chrome
  3. 翻译--Thinking in React
  4. EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
  5. 【BZOJ4805】欧拉函数求和(杜教筛)
  6. [Luogu3676]小清新数据结构题
  7. React-Native安装使用
  8. CSS中image和text显示高度不一致的问题
  9. Dapper一个和petapoco差不多的轻量级ORM框架
  10. windows7下django项目搭建