博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 通过元类控制类的创建
阅读量:6568 次
发布时间:2019-06-24

本文共 2098 字,大约阅读时间需要 6 分钟。

一、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__')        # 这儿其实是去调用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%的时候你需要控制创建类的过程,那就使用元类编程吧。

理解元类,大家可以参考这篇文章 

转载于:https://www.cnblogs.com/time-read/p/10603950.html

你可能感兴趣的文章
外包 银行数字签名U盘的用法
查看>>
我的友情链接
查看>>
Linux快捷键-命令行下
查看>>
java.util.ConcurrentModificationException
查看>>
Oracle中TO_DATE格式
查看>>
phpmyadmin error:#2002 - 服务器没有响应
查看>>
我的友情链接
查看>>
socket的三次握手
查看>>
Linux使用Nginx搭建图片服务器
查看>>
数据库分页大全
查看>>
mkfs.ext4 /dev/sdb 与 mkfs.ext4 /dev/sdb1
查看>>
Android 实用工具Hierarchy Viewer实战
查看>>
Wireshark抓包工具使用教程以及常用抓包规则
查看>>
体绘制(Volume Rendering)概述介绍
查看>>
Java模式(适配器模式)
查看>>
TimerHandler的简单应用
查看>>
swift:使用协议protocol设置颜色,UIImage的切圆角ImageWithCornerRadius
查看>>
来一场说聊就聊的压测分享
查看>>
如何兼容並蓄Android Studio 與 Eclipse 的優點, 減少顧此失彼的缺憾
查看>>
配置scp在Linux或Unix之间传输文件无需密码
查看>>