metaclass元类解析
一、创建类的流程


二、什么是元类
在Python3中继承type的就是元类
示例
# 方式一
class MyType(type):
'''继承type的就是元类'''
def __init__(self,*args,**kwargs):
print("MyType创建的对象",self) #Foo
super(MyType,self).__init__(*args,**kwargs) def __call__(self, *args, **kwargs):
obj = super(MyType,self).__call__(*args,**kwargs)
print("类创建对象",self,obj) #Foo class Foo(object,metaclass=MyType): # 对象加括号会去执行__call__方法,__call__方法里面继承了type的__call__方法
,type的__call__方法里面会先执行__new__方法,再去执行__init__方法。
所以,Foo就是用type创建出来的
user = "haha"
age = 18 obj = Foo()
# 方式二
class MyType(type):
def __init__(self, *args, **kwargs):
print("ssss")
super(MyType, self).__init__(*args, **kwargs) def __call__(cls, *args, **kwargs):
v = dir(cls)
obj = super(MyType, cls).__call__(*args, **kwargs)
return obj
#对象加括号就会去执行__call__方法
class Foo(MyType('Zcc', (object,), {})): #MyType('Zcc', (object,), {})相当于class Zcc(object):pass,也就是创建了一个Zcc的类
user = 'haiyan'
age = 18 obj = Foo()
# 方式三
class MyType(type):
def __init__(self, *args, **kwargs):
print("ssss")
super(MyType, self).__init__(*args, **kwargs) def __call__(cls, *args, **kwargs):
v = dir(cls)
obj = super(MyType, cls).__call__(*args, **kwargs)
return obj
#对象加括号就会去执行__call__方法 def with_metaclass(arg,base):
print("类对象",MyType('Zcc', (base,), {}))
return arg('Zcc', (base,), {}) #返回一个类对象 <class '__main__.Zcc'> class Foo(with_metaclass(MyType,object)): #MyType('Zcc', (object,), {})相当于class Zcc(object):pass,也就是创建了一个Zcc的类
user = 'haiyan'
age = 18 obj = Foo()
class ASD(type):
pass qqq = ASD("qwe", (object,), {}) #用ASD这个元类创建了一个(qwe,并且继承object类的)类 # class ASD(qwe):
# pass
obj = qqq()
# 能创建类的是元类
# 能创建对象的是类
print(obj) #<__main__.qwe object at 0x00000000024FFBA8>
print(obj.__class__) #<class '__main__.qwe'>
print(obj.__class__.__class__) #<class '__main__.ASD'>
print(obj.__class__.__class__.__class__) #<class 'type'>
print(obj.__class__.__class__.__class__.__class__) #<class 'type'>
其它
metaclass元类解析的更多相关文章
- python——type()、metaclass元类和精简ORM框架
1.type()函数 if __name__ == '__main__': h = hello() h.hello() print(type(hello)) print(type(h)) Hello, ...
- type和metaclass元类
元类type 1. 创建类的两种方式 (都是由type元类创建) 方式一: class Foo(object): # 默认metaclass = type, 当前类, 由type类创建 a = 'aa ...
- Python - metaclass元类
参考 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319106919 ...
- Python - metaclass元类(图)
个人总结
- 5、flask之信号和mateclass元类
本篇导航: flask实例化参数 信号 metaclass元类解析 一.flask实例化参数 instance_path和instance_relative_config是配合来用的:这两个参数是用来 ...
- flask之信号和mateclass元类
本篇导航: flask实例化参数 信号 metaclass元类解析 一.flask实例化参数 instance_path和instance_relative_config是配合来用的:这两个参数是用来 ...
- [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式
使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...
- 深刻理解Python中的元类(metaclass)以及元类实现单例模式
在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍 ...
- python 元类 type metaclass
python中一切皆对象,类对象创建实例对象,元类创建类对象,元类创建元类. 元类创建类对象有2中方式: 一.type方法 type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性 ...
随机推荐
- HTTP ERROR
HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HTTP 401.4 ...
- javaScript笔记01
所谓勇气就是明知前方的路途充满了荆棘险阻,但还是义无反顾的的走下去. 1 Javasrcipt定义的三种方式 ·1 head中的script脚本 <!DOCTYPE html> <h ...
- Learning Python 007 基本语句
Python 基本语句 if - 条件判断 没有什么好说的,直接上代码: age = 3 if age >= 18: print('adult') elif age >= 6: print ...
- R: factor & list 生成和操作因子、列表
################################################### 问题:生成.操作列表 & 因子 18.4.27 怎么生成列表 list.因子 fac ...
- 浅谈REST API
浅谈REST API 说明: 本文部分内容根据其它网络文章编写,如有版权问题请及时通知. 背景 发迹于互联网的REST,在国内国外混得可谓是风生水起,如今又进入电信行业的视野,连TMF都将其作为战略项 ...
- java加密MD5实现及密码验证
package test; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; impor ...
- [Swift]Scanner字符串扫描类
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- WebAPI学习及Swagger使用
本文用来保存自己学习WebAPI和Swagger使用过程中参考的文章,以及对WebAPI的初步了解. 1.RESTful风格 WebAPI只支持Http协议: 1.1.WebAPI与MVC的区别 Va ...
- sys_guid()
create extension "uuid-ossp"; create or replace function sys_guid() returns uuid as $$sele ...
- ldap第一天 编译安装LDAP + ldapadmin
此文整理学习此大神的博客:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26168435&id=5746284 一.环 ...