• 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设计等地方的时候元类还是能够发挥关键的数据的。。。


  • 相关阅读:
    第六周Java学习总结
    结对编程练习_四则运算(一)
    实验一Java开发环境的熟悉
    第四周Java学习总结
    第三周Java学习总结
    2019-2020-2 20175230滕星《网络对抗技术》Exp9 Web安全基础
    2019-2020-2 20175230 滕星《网络对抗技术》Exp 8 Web基础
    2019-2020-2 20175230滕星《网络对抗技术》Exp7 网络欺诈防范
    2019-2020-2 网络对抗技术 20175230滕星 Exp6 MSF基础应用
    2019-2020-2 网络对抗技术 20175230滕星 Exp5 信息搜集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4298507.html
Copyright © 2020-2023  润新知