返回顶部
首页 > 资讯 > 后端开发 > Python >python 通过元类控制类的创建
  • 803
分享到

python 通过元类控制类的创建

python 2023-01-31 00:01:25 803人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、python中如何创建类? 1. 直接定义类 class A:   a = 'a'   2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在Python中写的类,它可以创建一个对象a。其实

一、python中如何创建类?

1. 直接定义类

class A:
   a = 'a'

 

2. 通过type对象创建

在python中一切都是对象

在上面这张图中,A是我们平常在Python中写的类,它可以创建一个对象a。其实A这个类也是一个对象,它是type类的对象,可以说type类是用来创建类对象的类,我们平常写的类都是type类创建的对象,再由创建的对象再去创建我们平常使用的对象,我们可以看看type的官方文档

type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type

type有另一种用法type(name, bases, dict)来创建类 中,name是这个类的名字,bases是这个类的基类(是一个元组),dict是这个类的属性(是一个字典),我们通过type实现上面的例子中A类的创建

A = type('A', (), {'a': 'a'})

 

二、什么是元类编程

我们已经知道,类也是对象,那么我们在创建类的时候,可不可以控制类的创建过程?当然是可以的,这就是元类编程。

三、如何实现元类编程?

1. 在要定义的类中使用__new__方法

class A:
    def __new__(cls, *args, **kwargs):
        cls.a = 'a'
        return super().__new__(cls, *args, **kwargs)

 

这样就实现了创建A类的时候,添加了一个类属性a(注意的是,__new__方法要返回一个创建的对象,当然,我们也可以返回其他东西;另一个注意点是__new__方法要在实例化的时候才会运行,所以,类属性a必须是在A实例化后才会出现)

2. 使用metaclass关键字,使用metaclass关键字的时候,我们要定义一个type类

class B(type):
    def __init__(self, *args, **kwargs):
        self.a = 'a'
        super().__init__(*args, **kwargs)


class A(metaclass=B):
    pass

 

我们定义了一个B类继承type,在A类创建的时候传递关键字metaclass=B,就会执行B类种的代码,控制A类的创建,这个例子也是为A类添加了一个类属性a。我们还可以在B类中使用__init__,__call__方法。

四、python中元类编程执行的顺序

class MetaClass(type):
    # 定义A类的时候就会调用
    def __init__(self, *args, **kwargs):
        print('MetaClass __init__')
        super().__init__(*args, **kwargs)

    # 定义A类的时候,就会调用
    def __new__(cls, *args, **kwargs):
        print('MetaClass __new__')
        # *args 里面包含了创建A类的参数
        return super().__new__(cls, *args, **kwargs)

    # A实例化的时候才会去调用call
    def __call__(self, *args, **kwargs):
        print('MetaClass __call__')
        # 这儿其实调用的是type这个方法 type(name, bases, dict) *args 里面包含了创建A类的参数
        return super().__call__(*args, **kwargs)


class A(metaclass=MetaClass):
    def __init__(self):
        print('A __init__')

    def __new__(cls, *args, **kwargs):
        print('A __new__')
        return super().__new__(cls, *args, **kwargs)


a = A()


# 输出
MetaClass __new__
MetaClass __init__
MetaClass __call__
A __new__
A __init__

 

五、总结

使用元类编程可以让我们在创建类的时候,给类添加一些额外的信息。但元类编程是python中难以理解的地方之一,而且工作中,大部分时候都是不会用到的,我们普通的类定义方式就可以解决问题了,若果说有99%的时候你需要控制创建类的过程,那就使用元类编程吧。

理解元类,大家可以参考这篇文章  what are metaclass in python?

--结束END--

本文标题: python 通过元类控制类的创建

本文链接: https://lsjlt.com/news/181540.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 通过元类控制类的创建
    一、python中如何创建类? 1. 直接定义类 class A:   a = 'a'   2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以创建一个对象a。其实...
    99+
    2023-01-31
    python
  • python 使用元类type创建类
    目录1、type动态创建类 1.1 语法格式1.2 案例1:使用type创建类1.3 案例2:使用type创建带有属性(方法)的类1.4 案例3:使用type动态创建一个继...
    99+
    2024-04-02
  • Python元类是怎么创建一个类的
    本篇内容介绍了“Python元类是怎么创建一个类的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!如果你看过比较优秀的 Python 开源框架...
    99+
    2023-06-15
  • 详解如何创建Python元类
    目录什么是Python元类?Python中的类和对象Python中的动态类Python元类如何工作?类型类Python中的自定义元类Python中的__call__是什么?装饰器vs元类什么是Python元类? Py...
    99+
    2022-06-02
    python 元类
  • python类:class创建、数据方法属性及访问控制详解
    在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象。 python中创建类 创建一个Student的类,并且实现了这个类的初始化函数”__init__”: clas...
    99+
    2022-06-04
    详解 访问控制 属性
  • 举例讲解Python中metaclass元类的创建与使用
    元类是可以让你定义某些类是如何被创建的。从根本上说,赋予你如何创建类的控制权。 元类也是一个类,是一个type类。 元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类,如果此属性没有...
    99+
    2022-06-04
    Python metaclass
  • python 创建类cell数组
    When you do this: a = np.array([[np.array([[2, 2]]), np.array([[3, 3]])]]) the final call to np.array actually conc...
    99+
    2023-01-31
    数组 python cell
  • python中的元类
    目录 元类 什么是元类 自定义元类 其他 元类 什么是元类 我们创建一个类目的是为了...
    99+
    2023-01-30
    python
  • c++如何创建Singleton类的子类
    今天小编给大家分享一下c++如何创建Singleton类的子类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。创建Single...
    99+
    2023-06-19
  • Python Matplotlib通过plt.subplots创建子绘图
    目录前言一、只有子图的绘制二、单个方向堆叠子图三、行列方向扩展子图四、共享轴五、极坐标子图前言 plt.subplots调用后将会产生一个图表(Figure)和默认网格(Grid),...
    99+
    2024-04-02
  • PYTHON中如何创建一个类?
    可以使用 class 关键字来创建一个类: class MyClass: def __init__(self, arg1, arg2): self.arg1 = arg1 self.arg2 = arg2 ...
    99+
    2023-09-05
    python 开发语言
  • Python中动态创建类实例
    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下: def crea...
    99+
    2023-01-31
    实例 动态 Python
  • 如何通过Python/C API中提供相关函数来创建Python元组
    这篇文章将为大家详细讲解有关如何通过Python/C API中提供相关函数来创建Python元组,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如果你在Python/C API中提供 PyTu...
    99+
    2023-06-17
  • python的序列类型range怎么创建
    这篇“python的序列类型range怎么创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python的序列类型range...
    99+
    2023-06-26
  • 通过Python实现控制手机详解
    几天前我在考虑使用 python 从 whatsapp 发送消息。和你们一样,我开始潜伏在互联网上寻找一些解决方案并找到了关于twilio. 一开始,是一个不错的解决方案,但它不是...
    99+
    2024-04-02
  • 怎么在python中动态创建类
    这篇文章将为大家详细讲解有关怎么在python中动态创建类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3...
    99+
    2023-06-14
  • python中的type,元类,类,对象用法
    目录type,元类,类,对象简单描述类的生成方式元类元类type学习总结type的作用是干什么呢?type,元类,类,对象 简单描述 1.type是python内建元类,新建的元类需...
    99+
    2024-04-02
  • Python中动态创建类实例的方法
    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如...
    99+
    2022-06-04
    实例 方法 动态
  • python-pandas创建Series数据类型的操作
    1.什么是pandas 2.查看pandas版本信息 print(pd.__version__) 输出: 0.24.1 3.常见数据类型 常见的数据类型: - 一维: ...
    99+
    2024-04-02
  • python通过Windows下远程控制Linux系统
    一、学习目标 【通过Windows下远程控制linux系统实现对socket模块认识】 二、实验环境 Windows下(模拟客户端 [ IP:192.168.43.87 ] ):python3.6 Linux下(模拟服...
    99+
    2022-06-04
    python Windows 远程控制 linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作