python_107_ __metaclass__ 元类
类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?
答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

class MyType(type):
def __init__(self,what,bases=None,dict=None):
print("--MyType init--")
super(MyType,self).__init__(what,bases,dict)
def __call__(self, *args, **kwargs):
print("--MyType init--")
obj = self.__new__(self,*args, **kwargs)
self.__init__(obj,*args, **kwargs) class Foo(object):
__metaclass__ = MyType#此两行可写成class Foo(object,metaclass=MyType):
def __init__(self,name):
self.name = name
print("Foo --init__")
def __new__(cls, *args, **kwargs):#__new__是用来创建实例的(尽量不用),调用__init__(先于__init__执行)
print("Foo --new--",cls, *args, **kwargs)
return object.__new__(cls)#继承父类的__new__方法
#第一阶段:解释器从上到下执行代码创建Foo类
#第二阶段:通过Foo类创建obj对象
obj = Foo("Alex")
print(obj.name)
# 自定义元类
上述代码在python2中效果可看出
结果:

类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__
http://www.cnblogs.com/alex3714/articles/5213184.html
metaclass 详解文章:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 得票最高那个答案写的非常好
python_107_ __metaclass__ 元类的更多相关文章
- python day 11: 类的补充,元类,魔法方法,异常处理
目录 python day 11 1. 类的补充 1.1 通过反射来查找类,创建对象,设置对象的属性与方法 1.2 类的魔法方法:getitem,setitem 1.3 元类__metaclass__ ...
- Python中的元类和__metaclass__
1.什么是元类 元类让你来定义某些类是如何被创建的,从根本上说,赋予你如何创建类的控制权.可以把元类想成是一个类中类,或是一个类,它的实例是其它的类.当某个类调用type()函数时,你就会看到它到底是 ...
- python之元编程(元类实例)
本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保 ...
- python 元类
转载自 http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...
- [python]python元类
这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...
- Python基础:元类
一.概述 二.经典阐述 三.核心总结 1.类的创建过程 2.元类的使用惯例 四.简单案例 1.默认行为 2.使用元类 五.实践为王 一.概述 Python虽然是多范式的编程语言,但它的数据模型却是 纯 ...
- 深刻理解Python中的元类metaclass(转)
本文由 伯乐在线 - bigship 翻译 英文出处:stackoverflow 译文:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热 ...
- 深刻理解Python中的元类(metaclass)
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...
- python 元类与定制元类
1:元类 元类:类的创建与管理者 所有类的元类是type class a: pass print(type(a)) 结果:<class 'type'> 2:定制元类 类的实例化过程:(可看 ...
随机推荐
- Spring Data JPA stackoverflow
1.禁止使用lombok 的@Data 注释 使用@Data注释后,默认会重写父类的toString()方法,hashcode()等方法,在往map里存的时候,会根据equals和hashcode方法 ...
- MySQL生成UUID
UUID函数 在MySQL中,可以用uuid()函数来生成一个UUID,如下图: replace函数 默认生成的uuid含有'-',我们可以使用replace函数替换掉'-',SQL如下: selec ...
- 剑指Offer的学习笔记(C#篇)-- 合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 一 . 题目分析 根据题意,可得出,该题目要求两个单增的链表合成一条单增的链表. 链表一:1→5 ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- 黑马学习JavaWeb入门总结
- Swing 100行画图示例
关键内容,可以自行扩展 package main; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt ...
- Java EE学习笔记(九)
MyBatis的关联映射 1.关联关系概述 1).实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通 ...
- vue-cli搭建项目及代理路由设置
vue-cli 是vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. 安装 node ...
- mybatis 日期比较
entity @JSONField(name="prj_date",ordinal=13,format="yyyy-MM-dd") private Date p ...
- E. Selling Souvenirs 不会做
http://codeforces.com/contest/808/problem/E 不理解为什么dp = {cost, cnt1, cnt2}可以 而dp = {cost, cnt1, cnt2, ...