我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python 通过元类控制类的创建

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python 通过元类控制类的创建

一、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?

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python 通过元类控制类的创建

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python 通过元类控制类的创建

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

Python元类是怎么创建一个类的

本篇内容介绍了“Python元类是怎么创建一个类的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!如果你看过比较优秀的 Python 开源框架
2023-06-15

详解如何创建Python元类

目录什么是Python元类?Python中的类和对象Python中的动态类Python元类如何工作?类型类Python中的自定义元类Python中的__call__是什么?装饰器vs元类什么是Python元类? Python元类是与Pyth
2022-06-02

python类:class创建、数据方法属性及访问控制详解

在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象。 python中创建类 创建一个Student的类,并且实现了这个类的初始化函数”__init__”: class Student(object)
2022-06-04

举例讲解Python中metaclass元类的创建与使用

元类是可以让你定义某些类是如何被创建的。从根本上说,赋予你如何创建类的控制权。 元类也是一个类,是一个type类。元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类,如果此属性没有定义,它会向上查找父类中的__metac
2022-06-04

python的序列类型range怎么创建

这篇“python的序列类型range怎么创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python的序列类型range
2023-06-26

如何通过Python/C API中提供相关函数来创建Python元组

这篇文章将为大家详细讲解有关如何通过Python/C API中提供相关函数来创建Python元组,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如果你在Python/C API中提供 PyTu
2023-06-17

Python中动态创建类实例的方法

简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块。如下:def createInsta
2022-06-04

Android中Fragment子类及其PreferenceFragment的创建过程演示

Fragment创建方式 Fragment有两种使用方式:静态方式 和 动态方式。 1. 静态方式 第一步:先定义一个Fragment子类。public class ExampleFragment extends Fragment {@Ov
2022-06-06

Python创建类并使用的方法是什么

在Python中创建类并使用的方法如下:1. 使用`class`关键字定义一个类,并指定类的名称。2. 在类中定义类的属性和方法。3. 使用`__init__()`方法作为类的构造函数,在创建类的实例时进行初始化操作。4. 使用类的实例调用
2023-09-27

golang函数类型的动态创建与销毁机制

go 语言提供了 func 类型进行函数值动态创建和销毁:创建:使用 func 关键字动态创建函数类型,如 f := func(x int) int { return x * x }。调用:将函数值作为参数传递给另一个函数,如 call(f
golang函数类型的动态创建与销毁机制
2024-04-28

Go:如何创建带有单元测试值的 schema.ResourceData 类型的实例?

学习Golang要努力,但是不要急!今天的这篇文章《Go:如何创建带有单元测试值的 schema.ResourceData 类型的实例?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能
Go:如何创建带有单元测试值的 schema.ResourceData 类型的实例?
2024-04-04

PHP8如何通过Union Types更严格地限制变量的类型?

PHP8如何通过Union Types更严格地限制变量的类型?在过去的PHP版本中,变量的类型是比较自由的,我们可以将一个变量赋予不同的类型值,这可能导致程序中的类型不一致问题。所幸的是,PHP8引入了Union Types(联合类型),它
2023-10-22

Android中通过AsyncTask类来制作炫酷进度条的实例教程

AsyncTask (API level 3,所以几乎所有目前在市面上流通的 Android 版本皆可使用) 是除 Thread 外的另一种选择,Android 团队鼓励主执行绪(UI thread) 专注于操作 & 画面的流畅呈现, 其余
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录