Python -- 元编程

python元编程详解 一、元编程的概念 元编程依赖于python的一个叫做元类的概念。元类就是当你的某段代码在被执行的过程中,另外一段代码同时在被执行。维基百科上说的很好,在面向对象编程中,元类的实例还是类。 当我们定义一个类时,该类的对象都是由这个类来创建。但是类本身呢?类又是由什么来创建的呢? 这个问题就引申出元类的概念了,元类可以为其他类定义属性。举个例子,下面这段代码为每个类添加了一个hello属性,而这些类都是由定义的元类创建。也就是说,这些类都会有一个hello的属性,并不需要他们自己去定义。 运行上面的代码,得到 阅读详情

  • 元编程概念来自LISP和smalltalk。 我们写程序是直接写代码,是否能够用代码来生成未来我们需要的代码吗?这就是元编程

例如,我们写一个类class A,能否用代码生成一个类出来?

  • 用来生成代码的程序称为元程序metaprogram,编写这种程序就称为元编程metaprogramming
  • Python语言能够通过反射实现元编程
    Python中
    • 所有非object类都继承自object类
    • 所有类的类型包括type类都是type
    • type类继承自object类
    • object类的类型也是type类

type类

type构建类

class type(object):
    def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
        """
        type(object_or_name, bases, dict)
        type(object) -> the object's type
        type(name, bases, dict) -> a new type
        # (copied from class doc)
        """
        pass   
  • type(object) -> the object's type,返回对象的类型,例如type(10)
  • type(name, bases, dict) -> a new type, 返回一个新的类型
XClass = type('myclass', (object,), {'a':100, "b":'string'}) # (objcect,) 可直接为空元组()
print(XClass)
print('-' * 30)
print(XClass.__dict__)
print('-' * 30)
print(XClass.__name__)
print('-' * 30)
print(XClass.__bases__)
print('-' * 30)
print(XClass.mro())

# 执行结果
<class '__main__.myclass'>
------------------------------
{'a': 100, 'b': 'string', '__module__': '__main__',\
 '__dict__': <attribute '__dict__' of 'myclass' objects>, \
 '__weakref__': <attribute '__weakref__' of 'myclass' objects>, '__doc__': None}
------------------------------
myclass
------------------------------
(<class 'object'>,)
------------------------------
[<class '__main__.myclass'>, <class 'object'>]
  • 创建更加复杂的类
def __init__(self):
    self.x = 1000

def show(self):
    print(self.__dict__)

XClass = type('myclass', (object,), {'a':100, 'show':show, '__init__':__init__})
print(XClass)
print('-' * 30)
print(XClass.__dict__)
print('-' * 30)
print(XClass.__name__)
print('-' * 30)
print(XClass.mro())
print('-' * 30)
XClass().show()

# 执行结果
<class '__main__.myclass'>
------------------------------
{'a': 100, 'show': <function show at 0x0000024D0C7B5158>,\
 '__init__': <function __init__ at 0x0000024D0C7B51E0>, \
 '__module__': '__main__', '__dict__': <attribute '__dict__' of 'myclass' objects>,\
  '__weakref__': <attribute '__weakref__' of 'myclass' objects>, '__doc__': None}
------------------------------
myclass
------------------------------
[<class '__main__.myclass'>, <class 'object'>]
------------------------------
{'x': 1000}

总结

  • 可以借助type构造任何类,用代码来生成代码,这就是元编程

构建元类

一个类可以继承自type类

  • 注意不是继承自object类
class ModelMeta(type):
    def __new__(cls, *args, **kwargs):
        print(cls)
        print(args)
        print(kwargs)
        return super().__new__(cls, *args, **kwargs)

继承自type,ModelMeta就是元类,它可以创建出其它类

class ModelMeta(type): # 继承自type
    def __new__(cls, *args, **kwargs):
        print(cls)
        print(args)
        print(kwargs)
        print()
        return super().__new__(cls, *args, **kwargs)

class A(metaclass=ModelMeta):
    id = 1000

    def __init__(self):
        print('A.init~~~')

# 第二种 B继承自A后,依然是从ModelMeta的类型
class B(A):
    def __init__(self):
        print('B.init~~~')
# 第三种 元类就可以使用下面的方式创建新的类
C = ModelMeta('C', (), {})

# D、E是type的实例
class D: pass # D = type('D', (), {})
E = type('E', (), {})

class F(ModelMeta): pass

print('-' * 30)
print('A', type(A), A.__bases__)
print('B', type(B), B.__bases__)
print('C', type(C), C.__bases__)
print('~' * 30)

print('D', type(D), D.__bases__)
print('E', type(E), E.__bases__)
print('F', type(F), C.__bases__)

# 执行结果
<class '__main__.ModelMeta'>
('A', (), {'__module__': '__main__', '__qualname__': 'A',\
 'id': 1000, '__init__': <function A.__init__ at 0x0000021CDD5B5268>})
{}

<class '__main__.ModelMeta'>
('B', (<class '__main__.A'>,), {'__module__': '__main__', \
'__qualname__': 'B', '__init__': <function B.__init__ at 0x0000021CDD5B5598>})
{}

<class '__main__.ModelMeta'>
('C', (), {})
{}

------------------------------
A <class '__main__.ModelMeta'> (<class 'object'>,)
B <class '__main__.ModelMeta'> (<class '__main__.A'>,)
C <class '__main__.ModelMeta'> (<class 'object'>,)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D <class 'type'> (<class 'object'>,)
E <class 'type'> (<class 'object'>,)
F <class 'type'> (<class 'object'>,)

从运行结果还可以分析出·__new__(cls, *args, **kwargs)的参数结构:

  • 中间是一个元组('A', (), {'__init__': <function A.__init__ at 0x0000000000B6E598>, '__module__': '__main__', '__qualname__': 'A', 'id': 100})
  • 对应 (name, bases, dict)

修改代码如下

class ModelMeta(type): # 继承自type
    def __new__(cls, name, bases, dict):
        print('CLS : ', cls)
        print('NAME : ', name)
        print('BASES : ', bases)
        print('DICT : ', dict)
        return super().__new__(cls, name, bases, dict)
  • 执行结果
CLS :  <class '__main__.ModelMeta'>
NAME :  A
BASES :  ()

DICT :  {'__module__': '__main__', '__qualname__': 'A', 'id': 1000,\
 '__init__': <function A.__init__ at 0x000001DB6E6F5268>}
CLS :  <class '__main__.ModelMeta'>

NAME :  B
BASES :  (<class '__main__.A'>,)

DICT :  {'__module__': '__main__', '__qualname__': 'B', \
'__init__': <function B.__init__ at 0x000001DB6E6F5598>}

CLS :  <class '__main__.ModelMeta'>
NAME :  C
BASES :  ()
DICT :  {}
------------------------------
A <class '__main__.ModelMeta'> (<class 'object'>,)
B <class '__main__.ModelMeta'> (<class '__main__.A'>,)
C <class '__main__.ModelMeta'> (<class 'object'>,)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D <class 'type'> (<class 'object'>,)
E <class 'type'> (<class 'object'>,)
F <class 'type'> (<class 'object'>,)
  • 从运行结果可以看出,只要元类是ModelMeta,创建类对象时,就会调用ModelMeta的__new__方法
  • 上例中,F也是元类, F --继承自--> ModelMeta --继承自--> type
  • type(元类) 返回type。但是type被metaclass修改了的元类的类返回其元类

元类的应用

class Column:
    def __init__(self, fieldname=None, pk = False, nullable=False):
        self.fieldname = fieldname
        self.pk = pk
        self.nullable = nullable

    def __repr__(self):
        return "<{} {}>".format(__class__.__name, self.fieldname)

class ModelMeta(type):
    def __new__(cls, name, bases, attrs:dict):
        print(cls)
        print(name, bases, attrs)

        if '__tablename__' not in attrs:
            attrs['__tablename__'] = name.lower() # 添加表名

        primarykeys = []
        for k, v in attrs.items():
            if isinstance(v, Column):
                if v.fieldname is None or v.fieldname.strip() == '':
                    v.fieldname = k # 字段没有名字使用属性名
                if v.pk:
                    primarykeys.append(v)

        attrs['__primarykeys__'] = primarykeys
        return super().__new__(cls, name, bases, attrs)

class Base(metaclass=ModelMeta):
    """从ModelBase继承的类的类型都是ModelMeta"""

class Student(Base):
    id = Column(pk=True, nullable=False)
    name = Column('username', nullable=False)
    age = Column()

print('-' * 30)
print(Student.__dict__)

元编程总结

元类是制造类的工厂,是用来构造类的类

  • 构造好元类,就可以在类定义时,使用关键字参数·metaclass·指定元类,可以使用最原始的·metatype(name, bases, dict)·的方式构造一个类
  • 元类的 __new__()方法中,可以获取元类信息、当前类、基类、类属性字典

元编程一般用于框架开发中

  • 开发中除非你明确的知道自己在干什么,否则不要随便使用元编程
  • 99%的情况下用不到元类,可能有些程序员一辈子都不会使用元类

Django、SQLAlchemy使用了元类,让我们使用起来很方便

Python教程:了解Python的元编程 元编程是指在程序运行时创建或修改代码的能力。它是一种编写能够生成、检查或改变程序其他部分(如类、函数、模块)的代码的技术。元编程可以让开发人员更加灵活地处理代码结构,动态生成代码,实现代码重用和自定义功能。 阅读详情

相关推荐

飞塔防火墙CVE-2022-40684漏洞复现:手把手教你搭建靶场环境(附调试技巧)

本文详细指导如何搭建Fortinet飞塔防火墙CVE-2022-40684认证绕过漏洞的靶场环境,涵盖虚拟机部署、网络配置、调试模式开启及漏洞原理分析。通过手把手教程,读者可掌握漏洞复现与深度调试技巧,深入理解该认证绕过漏洞的利用与防御。

h6i7j8的博客 695

python元编程的书_C++模板元编程 PDF 超清版

给大家带来的一篇关于C++编程相关的电子书资源,介绍了关于C++、模板元、编程方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小24.03 MB,大卫 荣耀编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.2。内容介绍本书清晰地揭示了现代C++*威力的使用手法,将实际的工具和技术交付普通程序员的手中。元编程是产生或操纵程序码的程序。自从泛型编程被引入C++中以来,程序员们已经发...

weixin_39552179的博客 392

LTspice基础教程-024.参数扫描;step指令用法

step指令用于参数扫描,扫描步骤可以是线性的,对数的或列表。 下面介绍几种常用用法: 绘制一简单电阻分压电路,如下: 线性扫描 语法:.step param <Name> <Start Value> <Stop Value> <Increment> 例:.step param Res 20 100 20 意思是R2的阻值从20变化到100,...

gaoyong_wang的博客 3万+

Python 专家级编程第二版(二)

本章通过指向官方 Python 样式指南(PEP 8 文档)来解释了最受欢迎的编码约定。官方样式指南还补充了一些命名建议,这些建议将使您未来的代码更加明确,还有一些在保持代码风格一致方面不可或缺的有用工具。所有这些都为我们准备了本书的第一个实际主题——编写和分发软件包。在下一章中,我们将学习如何在公共 PyPI 存储库上发布我们自己的软件包,以及如何在您的私人组织中利用包装生态系统的力量。distutils允许你创建新的命令。新的命令可以通过入口点进行注册,这是由setuptools。

龙哥盟 1325

Yolov5s/Yolov8s网络结构图

yolov8、yolov5网络结构图

Goodness2020的博客 9924

保姆级避坑指南:在Ubuntu 22.04上成功复现VMamba模型(附完整环境依赖清单)

本文提供了在Ubuntu 22.04上复现VMamba模型的详细指南,包括环境准备、CUDA与PyTorch的精确匹配、依赖安装的疑难杂症解决以及完整环境清单。特别针对Linux系统下的环境复现问题,提供了实用的避坑技巧和验证方法,帮助开发者高效完成VMamba模型的部署。

weixin_29083373的博客 263

JAVA基础09 垃圾分代回收机制+Object+String

垃圾分代回收机制 栈–会产生无用的内容,会立即清除 方法区–类的信息 堆—无用对象,在某个时间进行回收 在程序启动的时候就会开始监测堆内存的使用情况,监测如果堆内存的使用率超过了一个临界值(0.75)就开始通知GC(Garbage Collector)进行垃圾回收,GC会在某个时间段进行垃圾回收----System.gc();–通知 内存分成新生代(伊甸园区和幸存区)和老生代, 新创建的对象会存储在伊甸园区,此时系统会对伊甸园区进行一次扫描,如果这个对象没有在使用就会被通知GC进行回收,如果还在使用就会把这

hty0506的博客 409

Windows环境下DataEase一站式安装指南(含WSL2+Docker配置)

本文详细介绍了在Windows环境下通过WSL2和Docker快速部署DataEase的完整教程。从WSL2配置、Docker环境搭建到DataEase离线安装,逐步指导用户完成一站式部署,特别适合需要快速搭建数据分析平台的开发者。教程包含常见问题解决方案和性能优化技巧,帮助用户高效使用这款国产开源数据可视化工具。

weixin_42526166的博客 392

python元编程运用_Python 中的元编程

就像元数据是有关数据的数据一样,元编程就是编写用于操纵程序的某些程序。人们普遍认为,元程序就是生成其他程序的某些程序,但范式更加广泛。所有旨在自我读取、分析、转换或修改的程序都是元编程的范例。例如:领域特定语言 (DSL)解析器解释器编译器定理证明器术语重写器本教程探究 Python 中的元编程。本文通过考察 Python 的特性,更新您的 Python 知识,让您能够更深入地理解本教程中的概念。...

weixin_35953844的博客 311

Matlab生成dsp程序——环境搭建(c2000系列[F28335、F2837x]都适用)

一、环境配置 (28377D的操作是一模一样就是硬件设置的时候需要选择28377d进行相应的设置) 1)matlab与ccs联合编译需要安装对应的matlab版本和ccs版本,且只有2016a以上的matlab支持c2000系列。具体对应关系参照: http://software-dl.ti.com/ccs/esd/documents/ccs_matlab.html 2)matlab版本确定之后,还需要安装有关于ccs的相关软件: I、TI Code Composer Studio xxxx(对应

qq_42151264的博客 2万+

ESP32 DW1000 UWB 室内定位系统

详细介绍ESP32 DW1000 UWB 室内定位系统的设计演示demo。

DT程序员的博客 1662

Python中的元编程(Meta-Programming)

元编程:是编写出可以操作的代码的行为,即用代码来操作另一个代码。 Python中的元编程:一种构建函数和类的行为,这些函数和类可以通过修改、包装现有代码或生成代码来进行操纵。 Python中元学习的实现方法: 装饰器 元类 1.装饰器 装饰器是一种不用修改原始代码结构来为现有函数增加新的功能的一种方法。 请看下面的几个函数实例:def add(x, y): return x + y ...

CurryCoder的个人博客 906

【eclipse】win 10:eclipse 4.9 下载、安装和汉化(支持中英切换)

目录 一、eclipse下载 二、eclipse安装 三、eclipse在线汉化 四、eclipse离线汉化(推荐) 一、eclipse下载 ①官网下载地址(收费):https://www.eclipse.org/downloads/点击前往下载 ②【推荐】我的百度网盘下载地址(包括离线汉化包):点击下载 提取码:0nfw ③eclipse4.9其他地址下载:http...

顾三殇 —— 博客空间(软件测试) 1万+

python元编程

前言 元编程概念来自LISP和smalltalk。 举个简单的栗子: 我们写程序是直接写代码,是否能够用代码来生成未来我们需要的代码呢?这就是元编程, ‘类’的’类’,也就是比类更高级的东西。 用来生成代码的程序成为元程序metaprogram,编写这种程序就称为元编程metaprogramming。 python通过反射来实现元编程。 python中,所有非object对象都继承自object...

ammmao的博客 1402

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python 元编程之类元编程

转载自我自己的 github 博客 ——> 半天钟的博客 元编程相关博文的目录及链接 这篇博文是元编程系列博文中的其中一篇、这个系列中其他博文的目录和连接见下: 使用 python 特性管理实例属性 浅析 python 属性描述符(上) 浅析 python 属性描述符(下) python 导入时与运行时 python 元编程之动态属性 python 元编程之类元编程 前言 所谓类元编程,...

BanTianZhong的博客 723

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python中的元编程

Python中的元编程 文章目录Python中的元编程type类构建元类元类的应用元编程总结 元编程概念来自LISP和smalltalk。 如果自己写的代码,能生成我们需要的代码。这就是元编程。即用代码生成代码。或者说用代码生成特定的类。例如:常用的class类,是否能够用代码直接生成class类,而不是用关键字class来定义。 用来生成代码的程序称为元编程metaprogram,编写这种程序...

兰枫 1264

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python元编程_Python中的元编程

就像元数据是关于数据的数据一样,元编程是编写程序来操作程序(Just like metadata is data about data, metaprogramming is writing programs that manipulate programs)。一个常见的看法是元编程是用来成成其他程序的程序,但是实际上它的含义更为广泛(It's a common perception that m...

weixin_39776787的博客 132

python元编程 实际应用_Python 元编程

Python 元编程要解决的问题python 元编程目的是为了让代码更加的灵活,实现的手段就是用代码生成代码,用代码修改代码。元编程的基础第一条、在 Python 的世界里一切都是对象,对象是类的实例,而类是元类的实例,元类也是类。第二条、创建实例由类的 __new__ 方法完成,创建完成之后交由 __init__ 初始化。为了一步步加大难度,在这里我们先会用 __new__ 修改实例的创建过程(...

weixin_39611208的博客 179

Python元编程

Python元编程 ctime:2020-03-19 23:47:37 +0900|1584629257 标签(空格分隔): 技术 元编程其实Ruby比较出名,因为Ruby的语法糖实在太多了,而且Ruby的对象模型比Python纯净,因此经常来说用Ruby来作为元编程的介绍。 之前用Python写无人机的仿真,为了写得舒服一点,在里面也实现了一些元编程的东西,这里记录一下。 调用父类的某函数...

qqNCer的博客 301

python元编程 实际应用_Python中的元编程

元编程概念来自lisp和smalltalk用于生成代码的程序成为元程序metaprogram,编写这种程序就成为元编程metaprogramming Python语言能够通过反射实现元编程。1、typeclass type(object):def __init__(cls, what, bases=None, dict=None): # known special case of type.__i...

weixin_39630880的博客 110

【Python高级特性】元编程

通过结合反射和装饰器,可以在不修改原始代码的情况下,动态地增强代码的功能,同时保持代码的清晰性和可维护性。

冰可乐的数据之路 1386

python之元编程

一、什么是元编程 元编程是一种编写计算机程序的技术,这些程序可以将自己看作数据,因此你可以在运行时对它进行内省、生成和/或修改。 Python在语言层面对函数、类等基本类型提供了内省及实时创建和修改的能力;我们可以使用装饰器向现有的函数、方法或类添加附加功能;同时我们也可以通过修改一些特殊的方法来变更类的行为; 二、使用的例子 面对一个复杂多变的json数据结构,虽然Python提供了处理JSon数据的API,但是返回的类型是dict,使用非常不方便不友好;接下来通过Python提供的元编程的能力,来实现

无风听海 2427

python元编程_Python-元编程

1、元编程:元编程 概念来自 LISP 和 smalltalk我们写程序 是直接写代码,是否能够用代码来生成未来我们需要的代码,这就是元编程。用阿里生成代码的程序称为元程序,metaprogram,编写这种程序就称为元编程。Python 语言能够通过反射实现 元编程python 中;所有非object 类都继承自object 类所有类的类型包括 type类 都是typetype类 继承自objec...

weixin_39628342的博客 135

Python元编程学习(1)

在类创建时,添加一个新方法# 使用自定义元类passobj.greet() # 输出:Hello from MyClass元编程是Python的高级特性,允许开发者动态操控代码结构,实现自动化和高级抽象功能。动态生成类:使用type动态创建类。元类:定制类的行为。动态属性与方法:增强对象的灵活性。实战案例:通过元编程实现简单的ORM模型。元编程并非日常开发的必需,但在构建框架、工具或需要高灵活性的场景中,能够带来巨大的帮助。

B5201234的博客 1506

Python面试题:使用Python进行元编程:元类和元编程技巧

元类: 用于创建和修改类的定义,是高级的元编程技术。通过自定义元类,可以控制类的创建过程和行为。装饰器: 用于修改函数或类的行为而无需直接修改它们的代码。可以在函数或类定义之前通过装饰器添加功能。描述符: 用于控制对对象属性的访问,通过实现__get____set__和__delete__方法来实现。动态属性和方法: 使用setattr和getattr可以动态地添加或修改对象的属性和方法。类工厂函数: 动态创建类,并根据需求生成不同的类定义。

杰哥在此的专栏 1372
上一篇: Python -- ORM(SQLAlchemy库)
下一篇: 前端技术风云录
鹿夏
博客等级 码龄8年 24粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值