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,然后要做的事情,其实也很简单,就是调用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设计等地方的时候元类还是可以发挥重要的作用的。。。

时间: 2024-08-06 19:47:44

python元类分析的相关文章

python元类__metaclass__

<pre name="code" class="python">#python元类,类的创建过程 #首先调用type.__new__ #然后调用类的构造函数 class.__init__ def toString(c): s=""; if type(c)==tuple: s="tuple:" for i in c: s+=str(i) s+="," return s elif type(c) =

python 元类的简单解释

本文转自博客:http://www.cnblogs.com/piperck/p/5840443.html 作者:piperck python 类和元类(metaclass)的理解和简单运用 (一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的类 class Trick(object): pass 当python在执行带class语句的时候,会初始化一

Python元类的一些应用

最近刚接触python的元类,网络上有比较详细的介绍,这里是在看Django时候发现一点关于元类的应用,做个笔记. from django.utils import six class A(type):     def __new__(cls, name, parents, attrs):         return type.__new__(cls, name, parents, attrs) class C(six.with_metaclass(A)):     pass 创建C类的时候,

Python元类

学懂元类,首先要知道两句话: 道生一,一生二,二生三.三生万物 我是谁?我从哪里来?我要到那里去? 在Python的世界里,拥有一个永恒的道:type,如此广袤无垠的Python生态圈,都是由type产生出来的. 道生一,一生二,二生三,三生万物. 道:即就是type 一:即是metaclass 二:即是class(或者实例生成器) 三:即是instance 1 关于类 道和一,是我们今天讨论的命题,而二.三.和万物,则是我们常常使用的类.实例.属性和方法,用hello world来举例: 1

Python—元类

什么是元类? 元类是类的类,是类的模板 元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为 元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例) type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象 方式一:使用class关键字 class Chinese(object): country='China

python元类深入理解

1.python 中的类 在python中,类也是一个对象,只不过这个对象拥有生成实例的能力,我们一般使用class XXX来定义一个类,在python解释器执行到这个地方的时候会自动创建出这个对象,python也为我们提供了手动创建类的方法,type().type()这个方法对我们来说并不陌生,我们所熟知的用法是:class = type(instance),当传入一个参数时,type()返回这个参数的类.而今天我们要用到的是type的另一个功能.type("classname",(

深入理解python元类

类也是对象 在理解元类之前,你需要先掌握Python中的类.Python 中的类概念借鉴 Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.当然在 Python 中这一点也是成立的. >>> class ObjectCreator(object): ... pass ... >>> my_object = ObjectCreator() >>> print my_object <__main__.

python元类深入解析

元类 什么是元类 元类是类的类,是类的模板(就如对象的模板是类一样) 元类的实例为类,类的实例为对象 元类是用来产生类的 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,是运行时动态创建的 __new__() 我们之前说类实例化第一个调用的是__init__,但__init__其实不是实例化一个类的时候第一个被调用 的方法.当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 __new__方法. __new__方法接受的参数虽

python 元类

元类(metaclass)是用来创建类的类 type(object):返回一个对象的类型,与object.__class__的值相同,type(name,bases,dict):创建一个新的type类型,name就是新class的name,值存到__name__属性中,bases是tuple类型,值会存到__bases__中,dict的值存到__dict__中 type exampleclass X: ... a = 1 ... X = type('X', (object,), dict(a=1