玩转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)
玩转type类型(牛逼克拉斯 )的更多相关文章
- 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)
我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...
- 最牛逼android上的图表库MpChart(二) 折线图
最牛逼android上的图表库MpChart二 折线图 MpChart折线图介绍 MpChart折线图实例 MpChart效果 最牛逼android上的图表库MpChart(二) 折线图 最近工作中, ...
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...
- 最牛逼android上的图表库MpChart(三) 条形图
最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...
- 最牛逼android上的图表库MpChart(一) 介绍篇
最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...
- 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生
科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生 黑科技,还是要提D.E.Shaw Research这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲D.E. Shaw这个人是怎 ...
- js深入研究之牛逼的类封装设计
<script type="text/javascript"> var Book = function(newIsbn, newTitle, newAuthor) { ...
- douban_转自熊博网——牛逼顿
转自熊博网——牛逼顿 来自: 天云之叶(大道易得,小术难求) 2010-04-21 18:32:27 牛逼顿 作者:singularitys 3月28号是牛顿的忌日,但是知道的人很少,我们毕竟更关心沈 ...
- Eclipse 最常用的 10 组快捷键,个个牛逼!
虽然栈长我现在不怎么用 Eclipse 了,但 Eclipse 的快捷键还是忘不了的,可以说 Eclipse 的快捷键很方便,恰到好处. 今天,我大概整理了 10 组 Eclipse 我觉得比较常用的 ...
随机推荐
- Atitit.协议的转换smb2http 原理
Atitit.协议的转换smb2http 原理 1. 协议的转换原理 stream的转换.. 2. 常用协议转换的情形 android通过SMB访问局域网共享文件 作者:: ★(attilax)&g ...
- 【转载】Js获取当前日期时间及其它操作
var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1 ...
- java-MapDemo
Map数据结构的使用 package com.example; import java.util.HashMap; import java.util.Map; /** * MapDemo.java D ...
- apache gzip
1.首先启动模块mod_deflate.so和mod_headers.so 2.httpd.conf #文件缓存时间配置<FilesMatch ".(flv|gif|jpg|jpeg| ...
- 2017-5-14 湘潭市赛 Parentheses 转化思想+贪心 使括号序列合法的最小花费。满足前面左括号的数量>=有括号的数量。
Parentheses Accepted : Submit : Time Limit : MS Memory Limit : KB Parentheses Bobo has a very long s ...
- ThinkPHP -- 问题
@.nginx下,找不到页面,如果然nginx支持pathinfo模式 原文:http://www.leixuesong.cn/1418 把文章的配置拷贝了下.
- java 获取网页指定内容-2(实践+修改)
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; ...
- Struts2开发者模式
在Struts2开发中,这应该是第一个学习配置的值.为了启用 Struts 2 的开发模式,可以通过自动配置显著增加Struts2的开发速度和属性文件加载,以及额外的日志和调试功能. 注:自动重新加载 ...
- WPF的本质:数据和行为
如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然 ...
- C++11写算法之插入排序
插入排序,是指将从1 –> size-1的数一个个插入到前面已经排序好的数组中. 时间复杂度:O(n^2) , O(nlgn) (lgn指使用二分查找插入点位置) 空间复杂度:O(1) // ...