玩转type类型(牛逼克拉斯 )

一、前言

  一说起type()方法肯定有很多人都知道这不就是查看某个对象类型的嘛,其实不然,他还有更牛逼的应用------创建类

>>> type(1)  
<class 'int'>  
>>> type('foo')  
<class 'str'>  
>>> type(3.0)  
<class 'float'>  
>>> type(float)  
<class 'type'>

 二、"type"的类型

    >>> class Foo(object):  
    ...     pass  
    >>> type(Foo)  
    <class 'type'>  
>>> type(str)
<class 'type'>
>>> type(float)
<class 'type'>
>>> type(int)
<class 'type'>

    哎呀我操,这是怎么回事为什么我自己创建的类的类型是type类型,更可恶的是为啥python自带的内建函数也都是他妈的type类型?

    总结:显然,所有类自身的类型都是`type`(无论是内建类型或是用户定义类型的类)。那么`type`的`type`又是什么呢?

三、type`的`type`

    >>> type(type)  
    <class 'type'>  

    好吧,测试到此为止。`type`是所有类型的类型,包括它自身。事实上,`type`是一个元类`metaclass`,也就是“一个用来构建类的东西”。诸如`list()`这样的类,是用来构建类的实例(instances),例如`my_list=list()`。而元类则以同样的方式来构建类型,例如以下代码:

    class Foo(object):  
        pass  

 四、创建自己的源类

   1、与常规类类似,元类也可以由用户自定义。具体用法是将目标类的`__metaclass__`属性设置为自定义的`metaclass`。`metaclass`必须是可调用(callable)的,并且返回一个`type`。通常,用户可以使用一个函数来设置`__metaclass__`属性,这个函数是`type`的另一种用法:利用三个参数创建一个新类。

   2、创建新类的方法

      方式1:通过class直接创建   

    class Foo(object):  
        pass  

      方式2:通过type创建

    格式:Foo = type('Foo', (), {})  
      第一个参数是class的名称,字符串形式;
      第二个参数是继承的父类集合,注意Python支持多重继承,如果只有一个父类,注意tuple的单元素写法;

      第三个参数是class的方法名称与函数绑定。

  目前Foo是一个名为“Foo”的类的引用,这个名为“Foo”的类以object为基类(通过type创建的类,如果没有特别指定其基类,将会默认创建新类型的类)。

       示例:

class Foo(object):
    a=123
obj=type('FFoo',(object,),{'a':123})
print(obj.a)
class Foo(object):
    class Meta:
      model=123
xoo=type('xoo',(object,),{'model':123})

xxoo=type('xxoo',(),{'_xoo':xoo})
print(xxoo._xoo.model)

 

 

posted @ 2017-10-23 16:48  mx轩  阅读(223)  评论(0编辑  收藏  举报