参考

  1. https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319106919344c4ef8b1e04c48778bb45796e0335839000
  2. https://zhuanlan.zhihu.com/p/28333506

1. 概念

1.1 MetaClass作用:用来指定当前类由谁来创建(默认type创建)

1.2 cls(metaclass=type)和cls(type)的区别

1.2.1

# 类由type来创建
class Foo(metaclass=type)
# 继承type
class Foo(type)

1.2.2

class Foo(object):
pass
obj = Foo()
# 对象是由类创建 # 一切皆对象,类由type创建
class Foo(object):
pass # 等价于上面
Foo = type('Foo',(object,),{}) # 一切皆对象,类由MyType创建
# MyType继承了type,里面什么都没写
class MyType(type):
pass
# 相当于type创建这个Foo类
Foo = MyType('Foo',(object,),{}) # 这Foo类是默认由type创建的,如果想要用MyType创建,就要写上metaclass=MyType,如下
class Foo(object):
pass class Foo(object,metaclass=MyType):
pass

1.2.3

# 一切皆对象,类由MyType创建
class MyType(type):
def __init__(self, *args, **kwargs):
super(MyType, self).__init__(*args, **kwargs) def __call__(cls, *args, **kwargs):
print('xxx')
return super(MyType, cls).__call__(*args, **kwargs) # MyType('Foo',(object,),{})等价于class Foo(object,metaclass=MyType)等价于class Foo(metaclass=MyType)
class Foo(object,metaclass=MyType):
pass # Foo是类,也是对象,Foo()调用创建它的类的__call__ --> Foo = MyType('Foo',(object,),{})
Foo() #输出xxx

2. 如何用metaclass?

第一种为Python3, 第二种为Python2/3

class Foo(metaclass=type):
pass class Foo(object):
__metaclass__ = type

3. 例子

3.1 MyType('Base', (object,), {}) 是由MyType创建; metaclass=MyType

3.2 type可以创建类时,metaclass=type;MyType创建类时,metaclass=MyType

3.3 Base = MyType('Base', (object,), {}) 等价于 Base(metaclass=MyType)

# 自定义元类
class MyType(type):
def __init__(self, *args, **kwargs):
super(MyType, self).__init__(*args, **kwargs) def __call__(cls, *args, **kwargs):
print('xxxx')
return super(MyType, cls).__call__(*args, **kwargs) # 用元类创建Base类,调用了元类的__call__
Base = MyType('Base', (object,), {})
Base() print(Base) #<class '__main__.Base'>
print(type(Base)) #<class '__main__.MyType'> # Foo继承Base类,也是指向同一个元类
class Base(metaclass=MyType):
pass
class Foo(Base):
pass
obj = Foo()

结果

xxxx
<class '__main__.Base'>
<class '__main__.MyType'>
xxxx

Python - metaclass元类的更多相关文章

  1. Python - metaclass元类(图)

    个人总结

  2. python——type()、metaclass元类和精简ORM框架

    1.type()函数 if __name__ == '__main__': h = hello() h.hello() print(type(hello)) print(type(h)) Hello, ...

  3. python中元类(metaclass)的理解

    原文地址:http://www.cnblogs.com/tkqasn/p/6524879.html 一:类也是对象 类就是一组用来描述如何生成一个对象的代码. 类也是一个对象,只要你使用关键字clas ...

  4. python 通过元类控制类的创建

    一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...

  5. Python之元类

    类型对象负责创建对象实例,控制对象行为.那么类型对象又由谁来创建呢? 元类(metaclass)——类型的类型 New-Style Class的默认类型是type >>> class ...

  6. Python 的元类设计起源自哪里?

    一个元老级的 Python 核心开发者曾建议我们( 点击阅读),应该广泛学习其它编程语言的优秀特性,从而提升 Python 在相关领域的能力.在关于元编程方面,他的建议是学习 Hy 和 Ruby.但是 ...

  7. python基础----元类metaclass

    1 引子 class Foo: pass f1=Foo() #f1是通过Foo类实例化的对象 python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载cl ...

  8. 谈谈Python中元类Metaclass(一):什么是元类

    简单的讲,元类创建了Python中所有的对象. 我们说Python是一种动态语言,而动态语言和静态语言最大的不同,就是函数和类不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个HelloW ...

  9. 谈谈Python中元类Metaclass(二):ORM实践

    什么是ORM? ORM的英文全称是“Object Relational Mapping”,即对象-关系映射,从字面上直接理解,就是把“关系”给“对象”化. 对应到数据库,我们知道关系数据库(例如Mys ...

随机推荐

  1. 【C语言】(for循环嵌套)找出1000以内的水仙花数

    什么是水仙花数? 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153). 分析: 根据定义可知: a*a*a+b*b*b+c*c*c ...

  2. Git管理代码

    使用Git管理代码 1. 分支管理模式 首先,master分支应该是非常稳定的,开发都在dev分支上,每个人都有自己的分支,时不时地往dev分支上合并就可以了.完成测试后,再把dev分支合并到mast ...

  3. jquery-1.10.2_d88366fd.js和jquery-3.1.0.min.js 在用touch事件时候, event.changedTouches[0]报错的问题。

    1.animation动画:(注意如果这个动画是一开始就执行的,在pc端就要用px,在手机端用rem,如果在pc端展示页面,但用的是rem为单位,这时候动画一开始就执行,因为根字体大小还没准备好,动画 ...

  4. web渗透(转)

    某天比较无聊,听一个朋友推荐httpscan这款工具,于是就下载下来试试. 首先对某学校网段开始进行测试. 1   python httpscan.py **.**.**.0/24 测试时发现有个比较 ...

  5. Bugku-CTF社工篇之社工进阶

     

  6. python 切片技巧

    说明: 字符串[开始索引:结束索引:步长] 开始索引:从指定位置开始截取: 结束索引:从指定位置结束截取,但不包含该位置的字符. 步长:不指定时步长为1: 1)当步长为正数时候,那么切片是从左到右进行 ...

  7. 在centos 7中安装phpmyadmin

    安装phpmyadmin数据库管理系统 //1.下载phpmyadmin包wget https://files.phpmyadmin.net/phpMyAdmin/4.7.0/phpMyAdmin-4 ...

  8. ETCD的常用命令

    Note that any key that was created using the v2 API will not be able to be queried via the v3 API. A ...

  9. Services: ARP Caching

    Online Help for Cisco IOS Release 12.2(15)JA Services: ARP Caching   ARP caching on the access point ...

  10. 并行效果&迭代器

    具体文章:ALEX的文章 https://www.cnblogs.com/alex3714/articles/5765046.html 串行的并行效果: import time def consume ...