zoukankan      html  css  js  c++  java
  • 玩转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)
    
  • 相关阅读:
    2016huasacm暑假集训训练四 递推_A
    2016huasacm暑假集训训练三 G
    2016huasacm暑假集训训练三 F
    今年暑假不AC
    Who's in the Middle
    The Suspects
    食物链
    抓牛问题
    士兵队列训练问题
    H
  • 原文地址:https://www.cnblogs.com/xuanan/p/7717652.html
Copyright © 2011-2022 走看看