码迷,mamicode.com
首页 > 编程语言 > 详细

python元类分析

时间:2014-11-03 21:03:01      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   sp   strong   on   2014   问题   log   

刚开始接触到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设计等地方的时候元类还是可以发挥重要的作用的。。。


python元类分析

标签:style   blog   ar   sp   strong   on   2014   问题   log   

原文地址:http://blog.csdn.net/fjslovejhl/article/details/40745651

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!