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()