平时经常看到元编程、DSL这样的字眼,它到底是什么意思?
我的理解来看。元编程就是“代码生成器”,你可以通过一些代码生成另一些代码(动态地、按需的)。DSL则是domain special language:为了解决某个问题而发明的语言,比如HTML SQL YACC,它的反面是C JAVA Python这些通用语言。与DSL经常提到的是ruby,为什么说ruby可以DSL呢?因为它语法丰富,支持各种简写,lamba,闭包,block等等,通过自定义的一套高级API从而实现一门特定领域的方言。这种方言是可以交给客户写的。
python中元编程的目标是:动态生成需要的类class。我们知道class实例化后就是instance,而python中的metaclass实例化后就是class了。先看一个例子
class MyMeta(type):
def __new__(cls, name, parents, attrs):
print("new info: ", cls, name, parents, attrs)
attrs['abcde'] = 'fghijk'
return type.__new__(cls, name, parents, attrs)
class C(metaclass=MyMeta):
pass
print(C.abcde)
输出结果是:
引用
fghijk
通过修改__new__里面的attrs就可以更改类的属性
python类在初始化的时候,经历了两个阶段,第一个阶段是分配空间__new__(),第二个阶段是初始化值__init__()。当类被创建时,python2会首先寻找__metaclass__是否存在,如果存在则调用__metaclass__。如果此类没定义__metaclass__就去看父类,父类没有就去模块里找(全局变量__metaclass__),包里再没有就把__metaclass__ = type作为类的metaclass。而python3先看自己metaclass有没有定义,如果没有就看父类,父类没有就用type
再介绍下__new__中各个参数的意思:cls代表调用__new__函数的class,name代表对象的__name__值,也就是名称,parents代表对象的父类元组,attrs代表类的属性字典。
metaclass功能就是这么简单,一般来说是用不上的,除非要大批量的修改类的属性。其实python本身就是动态语言,在运行时就可以更改属性。而且decorator也可以很好的修改调用对象前后的行为。所以metaclass了解就行。
metaclass还有一些比较边边角角的知识点,比如说MyMeta这里还会引入一个__prepare__函数:
#官方文档说要是classmethod类型
@classmethod
def __prepare__(self, *args, **kwargs):
print("__prepare__ called")
# return type.__prepare__(self, *args, **kwargs)
return kwargs
这个函数还要在__new__函数调用之前调用,这个函数必须返回一个用于存放类属性(namespace)的数据结构,默认情况下就是字典类型了。我在这里直接就把kwargs返回就可以,没问题的,极端点,return {}都是可以的。这里可以玩一下,比如说
return {'xx': 'yy'}
你会发现整个类中都会被添加xx这个属性……
最后附上几个小知识点:
#可以使用type动态创建一个类
myclass = type("MyClass", (), {})
print(myclass)
s = super(myclass, myclass())
#super其实返回一个super object
print(s)
#输出结果是:
<super: <class 'MyClass'>, <MyClass object>>
分享到:
相关推荐
### 深入Python的元宇宙:探索元类(Metaclass)的奥秘 #### Python 简介 Python 是一种流行的高级编程语言,由 Guido van Rossum 于 1989 年底发明,并于 1991 年发布了第一个公开发行版。Python 的设计哲学强调...
本书旨在帮助读者掌握Python编程的高级技巧和最佳实践,提升编程效率和代码质量。以下是该书可能涵盖的一些关键知识点: 1. **元编程**:Python支持元编程,即在运行时对代码进行操作。这包括创建动态类型、自定义...
元类编程是Python编程中一项强大的特性,它允许开发者在更高层次上控制类的行为,实现更加灵活和动态的编程方式。通过理解元类的工作原理和应用场景,开发者可以更好地利用Python的强大功能,构建出更加健壮和可扩展...
在Python编程中,Singleton模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这个模式在某些场景下非常有用,例如管理共享资源、配置对象或者数据库连接。在Python中,通常通过元类(metaclass...
- **元编程**:深入理解Python的动态特性,比如如何通过元类(meta-class)来自定义类的行为等。 #### 3. 实战项目演练 - **Web开发**:介绍Flask或Django等流行框架的基本用法,并结合实际案例演示如何构建一个简单...
1. **元编程**:元编程是指在运行时修改或创建代码的行为,Python提供了丰富的元类(metaclass)和动态类型系统支持。通过元编程,我们可以自定义类的行为,创建更灵活的软件架构。 2. **装饰器**:装饰器是一种...
很不错的python书 第1部分 Python核心 第1章 欢迎来到Python世界 1.1 什么是Python 1.2 起源 1.3 特点 1.3.1 高级 1.3.2 面向对象 1.3.3 可升级 1.3.4 可扩展 1.3.5 可...
### 详解Python单例模式与Metaclass #### 单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在某些情况下非常有用,比如当应用程序需要控制资源访问时...
原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR 作者: (美)Wesley J. Chun 译者: 宋吉广 出版社:人民邮电出版社 ISBN:9787115178503 上架时间:2008-6-23 出版日期:2008 ...
原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR 作者: (美)Wesley J. Chun 译者: 宋吉广 出版社:人民邮电出版社 ISBN:9787115178503 上架时间:2008-6-23 出版日期:2008 ...
- `__metaclass__`: 类级别的特殊属性,当定义类时,如果`__metaclass__`存在,Python会使用这个元类来创建类。 2. **元类的工作原理** - 类创建过程:Python首先查找类定义中的`__metaclass__`,如果没有,就从...
元编程,一个听起来特别酷的词,强大的Lisp在这方面是好手,对于Python,尽管没有完善的元编程范式,一些天才的开发者还是创作了很多元编程的魔法。Django的ORM就是元编程的一个很好的例子。 本篇的概念和例子皆在...
`meta_form_validators` 库提供了一种元类(metaclass)方法来处理表单验证,这种高级的编程技术可以用于在创建类时执行自定义操作。 在Python中,元类是创建类的类。通过使用元类,我们可以控制类的行为,比如在...
10. **高级话题**:包括生成器(Generator)、上下文管理器(Context Manager)、元类(Metaclass)等。这些高级特性让Python在处理某些特定问题时更加强大和灵活。 11. **网络编程**:Python提供了socket库进行...
12. **元编程**:探讨Python的动态特性,如元类(metaclass)、动态属性添加等。 13. **迭代器和生成器**:深入理解迭代协议,以及生成器在节省内存和控制流上的优势。 14. **集合操作**:掌握集合的特性,如并集...
Python进阶一步步理解Python中的元类metaclass Python进阶理解Python中的异步IO和协程(Coroutine),并应用在爬虫中 Python中最好用的异步爬虫库Aiohttp代码实例 Python进阶聊聊IO密集型任务、计算密集型任务,以及多...
元类,或者说是Meta Classes,在Python编程领域中扮演着非常特殊的角色。它们是类的类,或者说是一种用来定义类本身的类。理解元类的前提是对Python中的类有一定的认识。Python中的类与大多数其他语言中的类有所不同...
在Python编程语言中,接口类(Interface Class)是一种设计模式,用于定义子类必须遵循的规范,确保子类具有特定的公共方法。Python不同于某些面向对象的语言(如Java),它并没有内置的接口概念,但可以通过使用`...