06 | Tornado源码分析:元类编程

2020-06-06 16:21:23 浏览数 (1)

hello:

大家好,上篇我们分析了Configurable 类中的一部分内容,引出了元类编程的一个case,

05 | Tornado源码分析:Configurable 2020-05-23

本篇我们就通过代码看看,如何使用元类编程,来做一一些“私人订制”服务。

先为大家简单解释一下,什么是元类?写python 的都应该清楚,类创建实例对象,那类又是谁创建的呢?没错 就是元类。在编程界,类也是对象,正所谓一切接对象,一切皆可“盘”!

简单总结一下:元类就是创建类的类。可能听着有些绕口,我们看一个case 来

感受一下。

代码语言:javascript复制
# -*- encoding: utf-8 -*-
# !/usr/bin/python
"""
@File    : 1class.py
@Time    : 2020/6/03 20:02
@Author  : haishiniu
@Software: PyCharm
"""

import types


def log_deco(f):
    def _inner(*arg, **kwargs):
        print("enter")
        try:
            return f(*arg, **kwargs)
        finally:
            print("exit")
    return _inner


class MetaClass(type): # 注意:继承type类,而不是object类
    def __new__(cls, name, bases, attrs):
        # 可以在这里做一些 "私人订制"。eg:给类中所有的方法都加上一个打印日志的装饰器
        for attr_name, attr in attrs.items():
            if isinstance(attr, types.FunctionType):
                attrs[attr_name] = log_deco(attr)

        # 调用 父类的__new__方法,最终会调用到 type.__new__方法
        instance = super(MetaClass, cls).__new__(cls, name, bases, attrs)
        print("class is created at: %r" % instance)
        return instance

# py3 的写法
class MyClass1(metaclass=MetaClass):
    # 通过__metaclass__类属性,为类指定元类

    def method(self):
        print("I am method() in MyClass1")

if __name__ == "__main__":
    # 类是元类的对象~
    print(isinstance(MyClass1, MetaClass)) # True

    # 类的实例是类的对象
    print(isinstance(MyClass1(), MyClass1)) # True

    MyClass1().method()

到此,我们就看完了,下期我们继续回到源码上来继续往下研究。

0 人点赞