Python元编程
简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据,因此你可以在运行时对它进行内审、生成和/或修改”,本博参考<<Python高级编程>>将对元编程内容进行详细描述,若有不正确之处希望大家指出。
1. 概述
Python元编程有两种方法,一是采用类似“装饰器”的工具对基本元素(例如函数、类、类型)内审和对其进行实时创建和修改,二是运用类型"元类"的方式对类实例的创建过程进行修改,甚至于允许重新设计Python面对对象编程范式的实现。
2. 装饰器
关于装饰器的内容可以阅读上篇博客<<Python装饰器>>,链接:http://www.cnblogs.com/xiaobingqianrui/p/8435074.html
对wraps装饰器的使用进行补充说明,在类装饰器中使用闭包会导致生成的对象不再是被装饰的类的实例,二是在装饰器函数创建的子类的实例,这会影响__name__和__doc__等属性,在上篇我们使用@wraps装饰器对函数装饰器进行操作让问题得到解决,但在类装饰器中这一方法无效。
3. 元类
元类是Python的一个重要特性,是定义其他类的类,理解其工作方式,最重要的是要知道定义了对象实例的类也是对象,那么它一定有与其相关联的类,所有的类定义的基类都是内置的type类。
#coding=utf-8 class MyClass:
pass if __name__ == "__main__":
myclass = MyClass()
print ("type of myclass:", type(myclass))
print ("type of MyClass:", type(MyClass))
>>> type of myclass: <class '__main__.MyClass'>
>>> type of MyClass: <class 'type'>
3.1 type()语法
type()类作为class语句的动态等效,给定类名,基类名和属性映射会创建一个新类
#coding=utf-8 def func1(self):
print (1) def func2(*argv):
print (argv) if __name__ == "__main__":
MyClass = type("MyClass",(object, ), {"func1":func1, "func2":func2})
a = MyClass()
print (type(a))
a.func1()
a.func2(2)
>>> <class '__main__.MyClass'>
>>> 1
>>> (<__main__.MyClass object at 0x01A02270>,2)
3.2 元类的常用模板
#coding=utf-8 '''元类模板 '''
class MyClass(type):
#创建一个空的命名空间,返回一个空的dict
@classmethod
def __prepare__(mcs, name, bases, **kwargs):
print ("MyClass __prepare__")
return super().__prepare__(name, bases, **kwargs) def __new__(mcs, name, bases, namespace):
print ("MyClass __new__")
return super().__new__(mcs, name, bases, namespace) def __init__(cls, name, bases, namespace, **kdargv):
print ("MyClass __init__")
super().__init__(name, bases, namespace) def __call__(cls, *argv, **kdargv):
print ("MyClass __call__")
return super().__call__(*argv, **kdargv) class _MyClass(metaclass=MyClass):
def __new__(cls):
print ("_MyClass __new__")
return super().__new__(cls) def __init__(self):
print("__MyClass __init__")
super().__init__() if __name__ == "__main__":
a = _MyClass()
>>> MyClass __prepare__
>>> MyClass __new__
>>> MyClass __init__
>>> MyClass __call__
>>> _MyClass __new__
>>> __MyClass __init_
用class语句创建的每个类都隐式的使用type作为元类,可以用metaclass=“指定元类”的方式改变这一默认行为。
3.3 元类的使用
元类是一种非常强大的特性,但总是会是代码更加复杂,将其用于任意类型的类时,这可能会降低代码的鲁棒性,我们必须灵活的使用元类。
#coding=utf-8 class OrderedMeta(type):
@classmethod
def __prepare__(mcs, name, bases, **kdargv):
return super().__prepare__(mcs, name, bases, **kdargv) def __new__(mcs, name, bases, namespace):
namespace["orderofattr"] = list(namespace.keys())
return super().__new__(mcs, name, bases, namespace) class test(metaclass = OrderedMeta):
first = 8
secord = 2 if __name__ == "__main__":
print (test.orderofattr)
print (test.__dict__.keys())
>>> ['__module__', '__qualname__', 'first', 'secord']
>>> dict_keys(['__module__', 'first', 'secord', 'orderofattr', '__dict__', '__weakre
>>> f__', '__doc__'])
Python元编程的更多相关文章
- python元编程(metaclass)
Python元编程就是使用metaclass技术进行编程,99%的情况下不会使用,了解即可. Python中的类和对象 对于学习Python和使用Python的同学,你是否好奇过Python中的对象究 ...
- Python 元编程 - 装饰器
Python 中提供了一个叫装饰器的特性,用于在不改变原始对象的情况下,增加新功能或行为. 这也属于 Python "元编程" 的一部分,在编译时一个对象去试图修改另一个对象的信息 ...
- Python 元编程
1.为函数添加包装器 总是存在这样的场景,在一个函数执行前后需要做一些操作处理,常见于日志创建.权限认证或者性能分析等.但有一个问题存在,那就是被装饰的函数,其元信息会丢失,函数引用会指向装饰器的返回 ...
- Python高级编程第二版--笔记
不只是CPython Stackless Python Jython(与java集成) IronPython(与net集成) PyPy python真正出众的领域在于围绕语言打造的整个生态系统. Py ...
- python高级编程之元类(第3部分结束)
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元编程 #new-style类带来了一种能力,通过2个特殊方法(_ ...
- Python类元编程
类元编程是指在运行时创建或定制类.在Python中,类是一等对象,因此任何时候都可以使用函数创建新类,而无需用class关键字.类装饰器也是函数,不过能够审查.修改,甚至把被装饰的类替换成其他类.元类 ...
- Python的元编程案例
Python的元编程案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是元编程 元编程概念来自LISP和smalltalk. 我们写程序是直接写代码,是否能够用代码来生成 ...
- Python 元类编程实现一个简单的 ORM
概述 什么是ORM? ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码 ...
- python之元编程
一.什么是元编程 元编程是一种编写计算机程序的技术,这些程序可以将自己看作数据,因此你可以在运行时对它进行内省.生成和/或修改. Python在语言层面对函数.类等基本类型提供了内省及实时创建和修改的 ...
随机推荐
- Link-Cut-Trees
填坑,填坑,填坑…… 开篇镇人品……下文的比喻仅供娱乐…… 为了迎接JSZX校内互测,我临时填坑学了LCT…… 怎么说呢……我也是懵懵懂懂地看了N篇博客,对着标程敲上一发代码,然后才慢慢理解.这里推荐 ...
- HDU1061-Rightmost Digit-规律题,快速幂
Rightmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- BZOJ3109: [cqoi2013]新数独
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3109 搜索一遍.读入注意一下.. #include<cstring> #inclu ...
- vuex的使用及持久化state的方式
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 当我们接触vuex的时候,这是我们最先看到 ...
- 应用中Token的作用
Token 的作用 Token,就是令牌,最大的特点就是随机性,不可预测.一般黑客或软件无法猜测出来. 那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方: 1)防止表单重复提交 ...
- IOS开发之UIView总结1
太长了,请看 http://blog.csdn.net/xdrt81y/article/details/9128695 performSelector: performSelector:withObj ...
- EditText之边框颜色
EditText的自带属性里没有设置边框颜色的 有俩种方式可以达到效果 一种是网上比较推崇的用图作背景,另一种则是自绘 图作背景的: 首先重新定义一个style.在values文件夹下新建一个styl ...
- NSDateFormatter相关整理
//实例化一个NSDateFormatter对象NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; //设定时间格式,这里可 ...
- Asp.net Core 跨域配置
一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is present on the requested ...
- MYSQL ORDER BY Optimization
ORDER BY Optimization 某些情况下,MYSQL可以使用index排序而避免额外的sorting. 即使order by语句列不能准确的匹配index,只要没有index中(不在or ...