博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中的元类(metaclass)
阅读量:7282 次
发布时间:2019-06-30

本文共 1755 字,大约阅读时间需要 5 分钟。

推荐+收藏:

做一些笔记学习学习:

在大多数编程语言中,类就是用来描述如何生成一个对象的代码段,在Python中类也是一个对象,这个(类)对象自身拥有创建对象(类实例)的能力。

因为它的本质是一个对象:

  • 可以将它赋值给一个变量
  • 可以拷贝它
  • 增加属性
  • 作为参数进行传递
  • 可以在运行时动态地创建他们,可以在函数中创建类,只需要使用class关键字即可

当使用class关键字的时候,Python解释器会自动地创建这个对象,Python还提供了手动处理的方法:type()

type是一个生成类对象的类工厂,实际上也是一个类,专门构建类对象的类称为元类:

查看type的帮助信息如下:

Init signature: type(self, /, *args, **kwargs)Docstring:     type(object_or_name, bases, dict)type(object) -> the object's typetype(name, bases, dict) -> a new typeType:           type

1.第一示例,传入一个对象的时候,返回得是这个对象的Type类型信息,用于知道一个对象的类型是什么

2.第二个示例,传入的是类对象的信息,生成一个类对象,name为类名,bases为继承的父类,dict为属性字典,用于动态创建类

__metaclass__属性

可以在为类添加一个__metaclass__属性,在中元类的生命语法发生变化,通过在在基类的列表中指定metaclass关键字,例如:class Foo(base1, base2, metaclass=mymeta):pass

class Foo(object):    __metaclass__=something

当解释器解析后class Foo(object),类对象Foo并没有创建,Python会在类定义中寻找__metaclass__属性,用它创建,如果找到了,Python就会用它来创建Foo,没有就会使用type来创建。

class Foo(Bar):    pass

如果Foo没有__metaclass__属性,会继续父类Bar中递归地继续寻找__metaclass__属性,尝试之前操作。

下面types.py中源码,PEP 3115做出修改,提供了一个new_class用metaclass来动态地创建一个类对象,其中_calculate_meta函数用于计算衍生扩展最深的元类:

def _calculate_meta(meta, bases):    """Calculate the most derived metaclass."""    winner = meta    for base in bases:        base_meta = type(base)        if issubclass(winner, base_meta):            continue        if issubclass(base_meta, winner):            winner = base_meta            continue        # else:        raise TypeError("metaclass conflict: "                        "the metaclass of a derived class "                        "must be a (non-strict) subclass "                        "of the metaclasses of all its bases")    return winner

从上述代码可以看出对类对象每个基类都进行了判断比较,找出扩展最深的元类(winner)。

就元类本身而言,他们其实很简单:

  1. 拦截类的创建
  2. 修改类
  3. 返回修改之后的类

转载于:https://www.cnblogs.com/baishoujing/p/6366051.html

你可能感兴趣的文章
设计模式(四):单例模式与工厂模式
查看>>
Linux监控软件之 Nagios
查看>>
一文读懂柔性机器人,看似“柔若无骨”的背后有哪些黑科技
查看>>
任正非谈人工智能,AI需要的是“高质量”数据
查看>>
Linux IO多路复用之epoll网络编程(含源码)
查看>>
GCC笔记(警告.优化以及调试选项)
查看>>
MyBatis-多对一查询
查看>>
Virtual PC 2007下虚拟机与本机双XP系统实现互联与上网详解
查看>>
css中display设置为table、table-row、table-cell后的作用及其注意点
查看>>
Domino 8.5 迁移步骤-看图说话
查看>>
Openssl及加密解密(二)openssl
查看>>
个性心理测试
查看>>
Redis集群及管理讲解
查看>>
ps命令详解
查看>>
配置系列:ssm中applicationContext.xml的简单配置
查看>>
nginx启动脚本
查看>>
linux 出现bash: ****: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
查看>>
kickstart安装linux
查看>>
蓝色心情win7主题一键安装包 v 2.0
查看>>
MySQL5.7修改密码
查看>>