刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下。。不知道这是个啥东西。。。

用下面几个定义来说明吧:

(1)Python中,类也是对象。。仅仅只是这样的对象比較的特殊,他用于创建别的对象

(2)元类也是一种类,仅仅只是它更特殊。。。他是用来创建别的类的类。。。(呵呵,是不是非常拗口)

先来看一段代码吧:

  1. class Fjs(object):
  2. def __init__(self, name):
  3. self.name = name
  4.  
  5. def hello(self):
  6. print "hello by %s" % (self.name,)
  7.  
  8. print Fjs.__class__

这里的输出是:<type 'type'>

这里该怎么理解呢。。?依照上面说的。。。Fjs类事实上也是一种对象。。。那么Fjs类对象是由什么类来创建的呢。。?嗯。。就是由type类来创建的。。。

接下来来更改一下代码,换一种方法来创建Fjs类型:

  1. def __init__(self, name):
  2. self.name = name
  3.  
  4. def hello(self):
  5. print "hello by %s" % (self.name,)
  6.  
  7. attrs = dict()
  8. attrs["__init__"] = __init__
  9. attrs["hello"] = hello
  10.  
  11. Fjs = type("Fjs", (object,), attrs)
  12.  
  13. fjs = Fjs("fjs")
  14. fjs.hello()

这里也创建了Fjs类型,跟上面定义的Fjs类型是一样的。。只是这里换了一种定义的方式。。。

这里就看出来了type这个类是干啥用的了吧。。。

嗯,接下来引入元类的概念。。。。

在python中,类型的定义(新式类),事实上终于都是通过某个元类来创建一个类型对象。。。。普通情况下,假设没有特别指出。。。那么默认的元类就是type。。。通过上面说的两段代码,应该可以比較清楚的理解这个问题吧。。。

接下来我们写代码来看看自己定义元类吧:

  1. class Meta_Fjs(type):
  2. def __init__(self, name, parents, attrs):
  3. print "開始创建类型对象"
  4. super(Meta_Fjs, self).__init__(name, parents, attrs)
  5.  
  6. class Fjs(object):
  7. __metaclass__ = Meta_Fjs
  8.  
  9. def __init__(self, name):
  10. self.name = name
  11.  
  12. def hello(self):
  13. print "hello by %s" % (self.name, )

这里定义了一个Meta_Fjs元类,它继承了type,然后要做的事情,事实上也非常easy,就是调用type来创建类型对象就好了。。

在定义的Fjs类型中,我们指定了这个类的__metaclass__属性为刚刚创建的Meta_Fjs元类。。。

这样,在创建Fjs类型的时候,事实上就是通过Meta_Fjs来创建的了。。。。

当然这里事实上没有做什么事情。。。接下来做一些略微实用的事情吧:

  1. class Meta_Fjs(type):
  2. def __init__(self, name, parents, attrs):
  3. if "__str__" not in attrs:
  4. raise TypeError("未定义__str__方法")
  5. super(Meta_Fjs, self).__init__(name, parents, attrs)
  6.  
  7. class Fjs(object):
  8. __metaclass__ = Meta_Fjs
  9.  
  10. def __init__(self, name):
  11. self.name = name
  12.  
  13. def hello(self):
  14. print "hello by %s" % (self.name, )

这里在创建类型的时候,就要求必需要有__str__方法,假设没有的话,那么将会抛出异常,那么在执行的时候,接下的Fjs类型的定义就将会抛出异常。。想要顺利的通过,就需要在Fjs的定义中增加__str__方法

到这里为止,python的元类的大体上的一些概念就应该知道了吧。。。

事实上,普通情况下我们都不会用到元类相关的东西。。。只是在一些框架设计,API设计等地方的时候元类还是能够发挥关键的数据的。。。

python元类分析的更多相关文章

  1. python元类:type和metaclass

    python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...

  2. Python 元类 - Metaclasses

    Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...

  3. Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

  4. 深入理解 python 元类

    一.什么的元类 # 思考: # Python 中对象是由实例化类得来的,那么类又是怎么得到的呢? # 疑问: # python 中一切皆对象,那么类是否也是对象?如果是,那么它又是那个类实例化而来的呢 ...

  5. Python元类之由浅入深

    前言 ​ 元类属于python面向对象编程的深层次的魔法,非常重要,它使我们可以更好的掌控类从创建到消亡的整个生命周期过程.很多框架的源码中都使用到了元类.例如 Django Framework 中的 ...

  6. Python元类实战,通过元类实现数据库ORM框架

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架. 本文主要是受到了廖雪峰老师Python3入门教程的启 ...

  7. 参悟python元类(又称metaclass)系列实战(一)

    写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...

  8. python 元类

    转载自  http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...

  9. [python]python元类

    这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...

随机推荐

  1. Chapter 1 Securing Your Server and Network(3):使用托管服务帐号

    原文:Chapter 1 Securing Your Server and Network(3):使用托管服务帐号 原文出处:http://blog.csdn.net/dba_huangzj/arti ...

  2. 跨域请求jQuery的ajax jsonp使用常见问题解答

    前天在项目中写了ajax jsonp的使用,出现了问题:能够成功获得请求结果,但没有运行success方法,直接运行了error方法提示错误--ajax jsonp之前并没实用过.对其的理解为跟普通的 ...

  3. executeBatch()相关操作汇总

    环境:oracle使用PreparedStatement的executeBatch方法,如果DML操作成功,返回值[-2,-2,...]an array of update counts contai ...

  4. 人活系列Streetlights (秩)

    人活着系列之Streetlights Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 人活着假设是为了家庭,亲情----能够说是在这个世界上最温暖人心的, ...

  5. MySql分析算法作品索引(马上,只是说说而已B-tree)

    刚开始学习的时候,百度搜索.但我发现很难理解了很多的太复杂,各种物品的整合总结(建议可能看到的文字,我不明白也没关系,再看看操作步骤图,然后结合文,所以,一切都清楚了很多) B-tree.B这是bal ...

  6. MVC — 初步理解IIS工作流程

    声明:本文只是自己的总结和积累.IIS7.x 目录 IIS流程及组成部分 ASP.NET流程及组成部分 IIS与ASP.NET  MVC 一.IIS流程及组成部分 1.Http.SYS:负责监听HTT ...

  7. Lazy<T>延迟初始化

    延迟初始化:Lazy<T> 1. 概述 我们创建某一个对象需要很大的消耗,而这个对象在运行过程中又不一定用到,为了避免每次运行都创建该对象,这时候延迟初始化(也叫延迟实例化)就出场了. 延 ...

  8. PC结束 Spark 二次开发 收到自己主动,并允许好友请求

    本次Spark二次开发是为了客服模块的开发, 能让用户一旦点击该客服则直接自己主动加入好友.而客服放则需自己主动加入好友,不同弹出对话框进行允许,这方便的广大客服. 如今废话不多说,直接上代码. pa ...

  9. [程序安装包制作] Advanced Installer 备忘

    原文:[程序安装包制作] Advanced Installer 备忘 Product Information - Product Details 这个重点是Product Version.讲这个之前, ...

  10. 深入Java虚拟机——类型装载、连接(转)

    来自http://hi.baidu.com/holder/item/c38abf02de14c7d31ff046e0 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Ja ...