zoukankan      html  css  js  c++  java
  • python 面向对象专题(十二):元类(一): metaclass概述

    概述

    在我们深入细节之前,一个概括性的说明是必不可少的。

    class是一个对象,跟其他普通的对象一样,是某个东西的实例:比如metaclass。默认的metaclass是type。不幸的是,对于向后的兼容性,type有点乱:他同样可以用作一个function来返回一个对象的class。

    class Foobar:
         pass
    print(type(Foobar))
    foo = Foobar()
    print(type(foo))

    返回值

    <class 'type'>
    <class '__main__.Foobar'>

    如果你熟悉isinstance函数,你会知道这些:

    print(isinstance(foo, Foobar))
    # True
    print(isinstance(Foobar, type))
    # True

    foo是Foobar的实例,Foobar是type的实例,也就是下图,class是metaclass的实例。

     详述

    metaclass就是Python中用来创建class object的class。我们可以将其看做能够产生class的类工厂。我们可以通过如下例子理解这个关系:

     
    class = metaclass()
    object = class()

    从上文中我们知道了type()可以被用来动态创建class,这是因为实际上type是一个metaclass。而且type实际上是Python用在在幕后创建所有class的metaclass。

    包括int, string, function, class在内,Python中所有的东西都是object,而所有的object都是被相应的class创造的。我们可以通过__class__的值得知这一点。

    >>> age = 24
    >>> age.__class__
    <type 'int'>
    
    >>> name = 'bob'
    >>> name.__class__
    <type 'str'>
    
    >>> def foo(): pass
    >>> foo.__class__
    <type 'function'>
    
    >>> class Bar(object): pass
    >>> bar = Bar()
    >>> bar.__class__
    <class '__main__.Bar'>

    那么,这些__class____class__又是什么呢?

    >>> age.__class__.__class__
    <type 'type'>
    >>> name.__class__.__class__
    <type 'type'>
    >>> foo.__class__.__class__
    <type 'type'>
    >>> bar.__class__.__class__
    <type 'type'>

    可以看出,所有的class都来自于typetype,作为metaclass,创建了以上所有的class object。

    type是Python定义好的metaclass。当然,我们也可以自定义metaclass。

  • 相关阅读:
    hbase 相关
    java 连接 hiveserver2 例子
    ik_max_word ik_smart 区别 和 单字 查询 不到问题
    如何计算地址线和数据线
    golang consistent hash 菜鸟分析
    借助GitHub托管你的项目代码
    PHP性能追踪及分析工具xhprof的安装与使用
    git使用方法
    go开发
    go的websocket实现
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14732350.html
Copyright © 2011-2022 走看看