认识python中元类的准备工作。
1,首先需要明白一个概念就是python中一切皆为对象。
input: class Trick(object): pass print type(‘1234‘) print type(1234) print type(Trick()) output: <type ‘str‘> <type ‘int‘> <class ‘__main__.Trick‘>
2,什么是新式类,旧式类
知乎上的这篇文章个人表示不错,言简意赅:https://www.zhihu.com/question/22475395
1)首先,写法不一样:
class A: pass class B(object): pass
2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索。
3)新式类更符合OOP编程思想,统一了python中的类型机制。
3,type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)) 例子:type(‘trick‘, (), {})
下面开始进入主题:什么是元类
元类就是创建类的类,心里话工作中确实没有用到过,可能因为没有用到过才在想什么是元类,真的用到过可能不会再问为什么会有元类。
在stackoverflow看到的例子粘贴过来
函数做元类传递给类
input: def upper_attr(class_name, class_parents, class_attr): """ 返回一个对象,将属性都改为大写的形式 :param class_name: 类的名称 :param class_parents: 类的父类tuple :param class_attr: 类的参数 :return: 返回类 """ # 生成了一个generator attrs = ((name, value) for name, value in class_attr.items() if not name.startswith(‘__‘)) uppercase_attrs = dict((name.upper(), value) for name, value in attrs) return type(class_name, class_parents, uppercase_attrs) __metaclass__ = upper_attr pw = upper_attr(‘Trick‘, (), {‘bar‘: 0}) print hasattr(pw, ‘bar‘) print hasattr(pw, ‘BAR‘) print pw.BAR output: False True 0
正式类来作为元类传递给__metaclass__
class UpperAttrMetaClass(type): def __new__(mcs, class_name, class_parents, class_attr): attrs = ((name, value) for name, value in class_attr.items() if not name.startswith(‘__‘)) uppercase_attrs = dict((name.upper(), value) for name, value in attrs) return super(UpperAttrMetaClass, mcs).__new__(mcs, class_name, class_parents, uppercase_attrs) class Trick(object): __metaclass__ = UpperAttrMetaClass bar = 12 money = ‘unlimited‘ print Trick.BAR print Trick.MONEY
为什么要存在元类
元类的的目的:拦截类的创建,然后修改一些特性,然后返回该类。
就是感觉是装饰器干的事情,只是装饰器是修饰一个函数,同样是一个东西进去,然后被额外加了一些东西,最后被返回。
What is metaclass in Python http://stackoverflow.com/ques...
时间: 2024-11-08 01:29:06