python元类分析
刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下。。不知道这是个啥东西。。。
用下面几个定义来说明吧:
(1)Python中,类也是对象。。仅仅只是这样的对象比較的特殊,他用于创建别的对象
(2)元类也是一种类,仅仅只是它更特殊。。。他是用来创建别的类的类。。。(呵呵,是不是非常拗口)
先来看一段代码吧:
class Fjs(object):
def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name,) print Fjs.__class__
这里的输出是:<type 'type'>
这里该怎么理解呢。。?依照上面说的。。。Fjs类事实上也是一种对象。。。那么Fjs类对象是由什么类来创建的呢。。?嗯。。就是由type类来创建的。。。
接下来来更改一下代码,换一种方法来创建Fjs类型:
def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name,) attrs = dict()
attrs["__init__"] = __init__
attrs["hello"] = hello Fjs = type("Fjs", (object,), attrs) fjs = Fjs("fjs")
fjs.hello()
这里也创建了Fjs类型,跟上面定义的Fjs类型是一样的。。只是这里换了一种定义的方式。。。
这里就看出来了type这个类是干啥用的了吧。。。
嗯,接下来引入元类的概念。。。。
在python中,类型的定义(新式类),事实上终于都是通过某个元类来创建一个类型对象。。。。普通情况下,假设没有特别指出。。。那么默认的元类就是type。。。通过上面说的两段代码,应该可以比較清楚的理解这个问题吧。。。
接下来我们写代码来看看自己定义元类吧:
class Meta_Fjs(type):
def __init__(self, name, parents, attrs):
print "開始创建类型对象"
super(Meta_Fjs, self).__init__(name, parents, attrs) class Fjs(object):
__metaclass__ = Meta_Fjs def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name, )
这里定义了一个Meta_Fjs元类,它继承了type,然后要做的事情,事实上也非常easy,就是调用type来创建类型对象就好了。。
在定义的Fjs类型中,我们指定了这个类的__metaclass__属性为刚刚创建的Meta_Fjs元类。。。
这样,在创建Fjs类型的时候,事实上就是通过Meta_Fjs来创建的了。。。。
当然这里事实上没有做什么事情。。。接下来做一些略微实用的事情吧:
class Meta_Fjs(type):
def __init__(self, name, parents, attrs):
if "__str__" not in attrs:
raise TypeError("未定义__str__方法")
super(Meta_Fjs, self).__init__(name, parents, attrs) class Fjs(object):
__metaclass__ = Meta_Fjs def __init__(self, name):
self.name = name def hello(self):
print "hello by %s" % (self.name, )
这里在创建类型的时候,就要求必需要有__str__方法,假设没有的话,那么将会抛出异常,那么在执行的时候,接下的Fjs类型的定义就将会抛出异常。。想要顺利的通过,就需要在Fjs的定义中增加__str__方法
到这里为止,python的元类的大体上的一些概念就应该知道了吧。。。
事实上,普通情况下我们都不会用到元类相关的东西。。。只是在一些框架设计,API设计等地方的时候元类还是能够发挥关键的数据的。。。
python元类分析的更多相关文章
- python元类:type和metaclass
python元类:type和metaclass python中一切皆对象,所以类本身也是对象.类有创建对象的能力,那谁来创建类的呢?答案是type. 1.用tpye函数创建一个类 class A(ob ...
- Python 元类 - Metaclasses
Python 元类 - Metaclasses 默认情况下儿, classes 是有 type() 构造的. 类的结构体在一个新的 namespace 被执行, 类的名字 class name 绑定( ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- 深入理解 python 元类
一.什么的元类 # 思考: # Python 中对象是由实例化类得来的,那么类又是怎么得到的呢? # 疑问: # python 中一切皆对象,那么类是否也是对象?如果是,那么它又是那个类实例化而来的呢 ...
- Python元类之由浅入深
前言 元类属于python面向对象编程的深层次的魔法,非常重要,它使我们可以更好的掌控类从创建到消亡的整个生命周期过程.很多框架的源码中都使用到了元类.例如 Django Framework 中的 ...
- Python元类实战,通过元类实现数据库ORM框架
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架. 本文主要是受到了廖雪峰老师Python3入门教程的启 ...
- 参悟python元类(又称metaclass)系列实战(一)
写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...
- python 元类
转载自 http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...
- [python]python元类
这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...
随机推荐
- 安装numpy、nltk问题汇总
系统环境是win7(64bit)+python3.4(64bit)+numpy1.82+vs2012 1.假设用sourceforge上编译好的32bit的exe安装,会提示'python versi ...
- OCP-1Z0-051-名称解析-文章12称号
12. You need to produce a report where each customer's credit limit has been incremented by $1000. I ...
- Ant—Ant标签解释
采用ant命令必须写ant命令脚本,脚本由非常多Ant标签组成.现在总结一下我也遇到过Ant标签: 版权声明:本文博主原创文章,博客,未经同意不得转载.
- CreateEvent、SetEvent、ResetEvent和WaitForSingleObject
事件对象就像一个开关:它仅仅有两种状态---开和关.当一个事件处于"开"状态.我们称其为"有信号".否则称为"无信号". 能够在一个线程的运 ...
- 第三章_JSP
3.1.JSP概述 Jsp页面实在jsp容器中执行的.Servlet容器一般也是JSP容器.比如,Tomcat就是一个Servlet/JSP容器. 第一次请求一个jsp页面时,Servlet/JSP容 ...
- WebGL 在 OpenGL ES 指令 iOS 在 C 分歧版指令分析
WebGL 中 OpenGL ES 指令与 iOS 中 C 版指令的差异简析 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途 ...
- Java 多线程编程两个简单的例子
/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override publi ...
- ZendFramework2学习笔记 json和ajax
单程: View服务寄存器ViewJsonStrategy之后,有可能直接在控制器action是使用JsonViewModel输出json的数据. 注冊ViewJsonStrategy: //modu ...
- 前端angularjs+requirejs+dhtmlx 后端asp.net webapi
享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi 一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家 ...
- JAVA —— 数组
import java.util.Arrays; public class Array { public static void main(String[] args){ Array test= ...