简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据,因此你可以在运行时对它进行内审、生成和/或修改”,本博参考<>将对元编程内容进行详细描述,若有不正确之处希望大家指出。

1. 概述

Python元编程有两种方法,一是采用类似“装饰器”的工具对基本元素(例如函数、类、类型)内审和对其进行实时创建和修改,二是运用类型"元类"的方式对类实例的创建过程进行修改,甚至于允许重新设计Python面对对象编程范式的实现。

2. 装饰器

对wraps装饰器的使用进行补充说明,在类装饰器中使用闭包会导致生成的对象不再是被装饰的类的实例,二是在装饰器函数创建的子类的实例,这会影响__name__和__doc__等属性,在上篇我们使用@wraps装饰器对函数装饰器进行操作让问题得到解决,但在类装饰器中这一方法无效。

3. 元类

元类是Python的一个重要特性,是定义其他类的类,理解其工作方式,最重要的是要知道定义了对象实例的类也是对象,那么它一定有与其相关联的类,所有的类定义的基类都是内置的type类。

#coding=utf-8

classMyClass:pass

if __name__ == "__main__":

myclass=MyClass()print ("type of myclass:", type(myclass))print ("type of MyClass:", type(MyClass))

>>> type of myclass:

>>> type of MyClass:

3.1 type()语法

type()类作为class语句的动态等效,给定类名,基类名和属性映射会创建一个新类

#coding=utf-8

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

>>>

>>> 1

>>> (<__main__.MyClass object at 0x01A02270>,2)

3.2 元类的常用模板

#coding=utf-8

'''元类模板'''

classMyClass(type):#创建一个空的命名空间,返回一个空的dict

@classmethoddef __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

classOrderedMeta(type):

@classmethoddef __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= 8secord= 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元编程相关推荐

  1. python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__

    了解元类之前,先了解几个魔术方法: __new__.__init__.__call__ __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪 ...

  2. python函数的作用降低编程复杂度_Python函数式编程

    lambda 本文将介绍Python中函数式编程的特性.在对函数式编程的概念有了了解后,本文会介绍iterators和generators等语言特性,还有itertools和functools等相关的 ...

  3. python socket清空接收缓冲区_Python网络编程——修改套接字发送和接收的缓冲区大小...

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  4. python元类使用场景_Python元类使用简介

    本文概述 Python中的元类是定义类行为方式的类的类.类本身就是元类的实例. Python中的类定义了该类实例的行为.为了更好地理解元类, 需要具有使用Python类的先验经验.在深入研究元类之前, ...

  5. python并发之协程_python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  6. python和java对比并发_Python并发编程之从性能角度来初探并发编程(一)

    本文目录并发编程的基本概念 单线程VS多线程VS多进程 性能对比成果总结 前言 作为进阶系列的一个分支「并发编程」,我觉得这是每个程序员都应该会的. 并发编程 这个系列,我准备了将近一个星期,从知识点 ...

  7. python编程16章_Python核心编程——Chapter16

    好吧,在拜读完<Python网络编程基础>之后,回头再搞一搞16章的网络编程吧. Let's go! 16.4.修改书上示例的TCP和UDP客户端,使得服务器的名字不要在代码里写死,要允许 ...

  8. python编程规范 谷歌_Python最新编程规范,新手必学

    最近,团队又来了几个小伙伴,经过一段时间磨合之后,发现彼此之间还是比较默契的,但有一个很大的问题是,每个人的编程风格和习惯都不同,导致现在代码看起来非常混乱. 这里还要注意:不管你是想学Python还 ...

  9. python并发编程调优_Python并发编程-并发解决方案概述

    Python并发编程-并发解决方案概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发和并行区别 1>.并行(parallel) 同时做某些事,可以互不干扰的同一个时 ...

最新文章

  1. python 的String,集合(List,元组,Dict)
  2. 设计模式的理解: 访问器模式 Visitor
  3. JAVA无法加载此类文件,Java 7错误:无法加载本机库:ld.so.1:java:致命:libscf.so.1:打开失败:没有此类文件或目录...
  4. 无监督和有监督的区别_无监督元学习(Unsupervised Meta-Learning)
  5. QTP基础学习(二)启动与设置
  6. Linux命令终端提示符显示-bash-4.2#解决方法【转载】
  7. 生产电池要什么计算机技术,锂离子电池生产的几个关键工序讲解
  8. 建立立方体求面积和体积并用两种判断方法判断两个立方体是否相等(键盘输入数据)
  9. 如何才能提高团队工作效率
  10. 【转载】9个offer,12家公司,35场面试,从微软到谷歌
  11. CF235C-Cyclical Quest
  12. 入门推荐系统,这25篇综述文章足够了
  13. 第二篇 简洁但功能强大的EditPlus——我的最爱
  14. html获取随机字母,html5 canvas随机生成英文字母数字组合图片验证码代码
  15. Netty框架之Selector使用详解
  16. IAR for ARM系列教程(二)_主窗口与工具栏的描述
  17. python抓取微信文件_fiddle python抓取微信公众号文章
  18. linux 为执行程序添加一个交互确认执行的信息
  19. charts漏斗图表_漏斗图 | ECharts 数据可视化实验室
  20. README.md 文件的作用和语法

热门文章

  1. 计算机二级c语言模拟题,2016下半年计算机二级C语言模拟试题及答案
  2. tcga数据下载_TCGA数据下载-GDC
  3. springboot整个缓存_springboot整合ehcache缓存
  4. ROS入门 通信架构
  5. 周期(KMP算法之Next数组的性质)
  6. F - Prime Path
  7. 语义分割——上采样插值resize的学习笔记
  8. 阿维·阿斯平纳尔的闹钟——亨利·劳森
  9. Java中Object转Map类型,Map转Object类型
  10. 【Pytorch】nvidia-dali——一种加速数据增强的方法