Python 类、元类小实验

理解python的类实例化
class type(name, bases, dict)官方定义
object.__new__(cls[, ...])官方定义
Customizing class creation 定制类创建 官方文档
Built-in Types 内建类型 官方文档

准备知识

  • 当一个类定义被执行,发生了这些事:
    • 一个合适的元类被确定
    • 类命名空间被准备好
    • 类主体被执行
    • 类对象被创建
  • 类中定义的__new__(cls[, ...])方法用来创建类cls的一个新实例,它是特殊的不用声明的静态方法。
  • 类中对__call__方法的定义意味着对该类的实例的括号运算符的重载。
  • type(x)返回x的类型。类是元类的实例(Python中一切皆对象,类也是对象,对象是类的实例,只不过类的类是特殊的元类),所以int的类是type(元类)。表示构造关系。整型1由int类构造,int类由元类构造。(类名+括号运算符调用类的构造函数,类定义的过程即是元类实例化的过程,元类中实现了构造类的规则)。
a = 1
type(a)
# int
type(int)
# type
  • x.__mro__返回类x的所有超类(父类)(包括x自身)(MRO-方法解析顺序),表示类之间的继承关系,int继承object。继承关系和构造关系是两回事。
int.__mro__
# (int, object)

实验


理解

  • MyType继承type并重载type中的方法,是我们自定义的元类。指定类MyTypeInstance的元类为MyType意味着用MyType来构建类MyTypeInstanceMyType中重载的__new____init__方法影响类MyTypeInstance的定义过程。__new__可以控制类名与类属性的审查,__init__可以增加或修改类的属性。而MyType__call__方法则控制类MyTypeInstance的实例化过程。

  • MyType元类默认是type(与继承type无关),即MyTypetype的实例,亦即MyType = type(name, bases, dict)MyType的定义过程(即type类的实例化过程)调用的是type__call__方法。
    __new__是静态方法,__call____init__是实例方法。实际上isinstance(type, type)得到True,即typetype的实例,type调用__call__方法也就说得通了,也就是type实例+()运算符 等于 type实例调用了它的类type中定义的__call__实例方法。在__call__方法中先调用__new__静态方法来产生一个python对象,然后调用type实例的__init__方法修改新对象的属性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,967评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • 了解元类之前,先了解几个魔术方法: __new__、__init__、__call__ __new__: 对象的创...
    大富帅阅读 9,209评论 2 16
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,238评论 4 16
  • 梦到一条特殊的鱼向我游来 一条月光下的鱼 一支银辉波动的浪漫曲 一首疗伤的阳光诗 这条鱼融进渴望与透明 这会儿奔迸...
    花香一路阅读 272评论 2 16