Python元编程详细教程

news2024/11/26 15:25:59

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据,

因此你可以在运行时对它进行内审、生成和/或修改”,

本博参考<<Python高级编程>>将对元编程内容进行详细描述,若有不正确之处希望大家指出。

1. 概述

Python元编程有两种方法:

一是采用类似“装饰器”的工具对基本元素(例如函数、类、类型)内审和对其进行实时创建和修改,

二是运用类型"元类"的方式对类实例的创建过程进行修改,甚至于允许重新设计Python面对对象编程范式的实现。

2. 装饰器

对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语句的动态等效,给定类名,基类名和属性映射会创建一个新类

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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 元类的常用模板
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
'''元类模板 '''
class MyClass(type):
#创建一个空的命名空间,返回一个空的dict   
    
    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 元类的使用

元类是一种非常强大的特性,但总是会是代码更加复杂,

将其用于任意类型的类时,这可能会降低代码的鲁棒性,我们必须灵活的使用元类。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class OrderedMeta(type):
    
    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__'])

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1162370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud篇---第三篇

系列文章目录 文章目录 系列文章目录一、负载平衡的意义什么?二、什么是Hystrix?它如何实现容错?三、什么是Hystrix断路器?我们需要它吗?一、负载平衡的意义什么? 在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多 种计算资源的…

超高真空变温台的真空压力和气氛精密控制解决方案

摘要&#xff1a;针对目前国内外显微镜探针冷热台普遍缺乏真空压力和气氛环境精密控制装置这一问题&#xff0c;本文提出了解决方案。解决方案采用了电动针阀快速调节进气和排气流量的动态平衡法实现0.1~1000Torr范围的真空压力精密控制&#xff0c;采用了气体质量流量计实现多…

配置OpenCV

Open CV中包含很多图像处理的算法&#xff0c;因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV&#xff0c;需要进行手动配置&#xff0c;下面给出在VS2017中配置Open CV的详细步骤。 1.下载并安装OpenCV3.4.1与VS2017的软件。 2.配置Open CV环…

纠结蓝桥杯参加嵌入式还是单片机组?

纠结蓝桥杯参加嵌入式还是单片机组? 单片机包含于嵌入式&#xff0c;嵌入式不只是单片机。. 你只有浅浅的的单片机基础&#xff0c;只能报单片机了。最近很多小伙伴找我&#xff0c;说想要一些单片机资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵…

Selenium安装WebDriver Chrome驱动(含 116/117/118/119/120/)

1、确认浏览器的版本 在浏览器的地址栏&#xff0c;输入chrome://version/&#xff0c;回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号&#xff08;只看大版本&#xff09;下载对应文件 2.2 116版本…

1. eulerAngles函数

对线性代数库Eigen3中eulerAngles函数的理解_qingtian11112的博客-CSDN博客作用&#xff1a; 将旋转矩阵转换为欧拉角 Vector3f ea mat.eulerAngles(2, 0, 2); // 等价于 mat AngleAxisf(ea[0], Vector3f::UnitZ())* AngleAxisf(ea[1], Vector3f::UnitX())* AngleAxisf(ea[…

《Pytorch新手入门》第二节-动手搭建神经网络

《Pytorch新手入门》第二节-动手搭建神经网络 一、神经网络介绍二、使用torch.nn搭建神经网络2.1 定义网络2.2 torch.autograd.Variable2.3 损失函数与反向传播2.4 优化器torch.optim 三、实战-实现图像分类(CIFAR-10数据集)3.1 CIFAR-10数据集加载与预处理3.2 定义网络结构3.3…

99/年服务器测评,续费也99一年,真香,值得入手

每个帐号都有开通名额&#xff0c;开通99元一年&#xff0c;配置2核2G 40G 3M(不限流量)&#xff0c;续费也是99一年 开通之后就可以直接续费&#xff0c;免除后顾之忧&#xff08;一年一年的去续费&#xff0c;直接选择5年价格不太对&#xff09; 地址&#xff1a;https://mur…

成为java高手的八个条件

成为java高手的八个条件 1、扎实的基础 数据结构、离散数学、编译原理&#xff0c;这些是所有计算机科学的基础&#xff0c;如果不掌握它们&#xff0c;很难写出高水平的程序。程序人人都会写&#xff0c;但当你发现写到一定程度很难再提高的时候&#xff0c;就应该想想是不…

投资者如何保障个人利益?行业律师与欧科云链专家给出建议

香港作为全球加速拥抱Web3变革的引领之地&#xff0c;规定自今年6月起在香港经营虚拟资产服务业务需申领牌照。蜂拥而至的Web3创业公司&#xff0c;伺机而动的加密货币交易所&#xff0c;以及跃跃欲试的行业从业者&#xff0c;都让这座金融之都热闹非凡。但近期伴随JPEX诈骗案等…

HarmonyOS UI 开发

引言 HarmonyOS 提供了强大的 UI 开发工具和组件&#xff0c;使开发者能够创建吸引人的用户界面。本章将详细介绍在 HarmonyOS 中应用 JS、CSS、HTML&#xff0c;HarmonyOS 的 UI 组件以及如何自定义 UI 组件。 目录 JS、CSS、HTML 在 HarmonyOS 中的应用HarmonyOS 的 UI 组…

使用 Sealos 将 ChatGLM3 接入 FastGPT,打造完全私有化 AI 客服

FastGPT 是一款专为客服问答场景而定制的开箱即用的 AI 知识库问答系统。该系统具备可视化工作流功能&#xff0c;允许用户灵活地设计复杂的问答流程&#xff0c;几乎能满足各种客服需求。 在国内市场环境下&#xff0c;离线部署对于企业客户尤为重要。由于数据安全和隐私保护…

springboot--多环境配置快速切换开发、测试、生产环境

多环境配置快速切换开发、测试、生产环境 前言1、使用1.1指定环境Profile({"dev","test"})Spring Profiles 提供一个隔离配置的方式&#xff0c;使其仅在特定环境生效 任何Component,Configuration或ConfigurationProperties 可以使用Profile标记&#xff…

11.2树的高度,表达式树,非递归遍历,层序遍历,奇偶树

课上 前序&#xff0c;根左右 中序&#xff0c;左根右 若前序中序相同&#xff0c;则树都没有左节点 求树的高度 表达式树 中缀表达式树 主要考虑括号问题 这个就是考虑递归底层&#xff0c;要结束时的情形&#xff1b;以及根节点的情形&#xff1b; 由于表达式树是满树&…

数据库实验:SQL的数据定义与单表查询

目录 实验目的实验内容实验要求实验过程实验步骤实例代码结果示意 数据库的实验&#xff0c;对关系型数据库MySQL进行一些实际的操作 实验目的 (1) 掌握DBMS的数据定义功能 (2) 掌握SQL语言的数据定义语句 (3) 掌握RDBMS的数据单表查询功能 (4) 掌握SQL语言的数据单表查询语句…

UN38.3认证和MSDS有什么区别? 锂电池UN38.3检测标准要求

通常很多人做电池检测的时候&#xff0c;将UN38.3和MSDS混淆或者认为是同一个认证&#xff0c;这对办理检测有非常大的影响。MSDS是化学安全技术说明书&#xff0c;是一份对锂电池成分以及应急处理的文件&#xff0c;UN38.3是对锂电池的一份安全检测。因为锂电池要空运&#xf…

使用 javascript 在 n*m 网格中演示 BFS 广度优先搜索算法求最短路径

完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style type"text/css">#box1 table{border: 0px;border-collapse: collapse;cursor: poi…

protected by SourceGuardian and requires a SourceGuardian loader ‘ixed.8解决方案

php相关问题 安装程序提示以下内容 遇到某些php程序的安装提示&#xff1a; PHP script ‘/www/wwwroot/zhengban.youyacao.com/install/index.php’ is protected by SourceGuardian and requires a SourceGuardian loader ‘ixed.8.1.lin’ to be installed. 1) Click her…

面试测试岗脑子里实在没货,简历(软件测试)咋写?

简历咋写&#xff0c;这是很多没有【软件测试实际工作经验】的同学们非常头疼的事情。 简历咋写&#xff1f;首先你要知道简历的作用。 简历的作用是啥呢&#xff1f; 一句话就是&#xff1a;让HR小姐姐约你。 如何让HR看你一眼&#xff0c;便相中你的简历&#xff0c;实现在众…