Python的type内置类详解

欢迎来到本文

Type简介

在Python中,type是一个内建的类,它是用于表示对象的类型的类。type类本身也是一个对象,它是所有类型对象的元类型(metaclass)

Type的常见用法

如官方文档所见,两种常见用法,相信不少朋友对第二种还不太熟悉
在这里插入图片描述

用法1-获取对象的类型

这应该是我们最常用的了,调用type(obj),会返回obj对象的类型对象,它的工作流程是什么呢?答:
在Python中,每个对象都有一个内部的数据结构,称为对象头(object header)。对象头包含一些元数据,如对象的引用计数和类型信息。类型信息用于确定对象的类型。
在C语言中,Python解释器定义了一个叫做PyObject的结构体来表示所有的Python对象。PyObject结构体中有一个成员叫做ob_type,它是一个指向类型对象(type object)的指针。调用type(obj)时,解释器会获取obj对象的对象头中的ob_type指针,并返回指向该类型对象的指针。这样就获得了对象的类型。

用法2-创建新的类

可以使用type类来动态创建新的类。type类的构造函数接受三个参数:类的名称、基类的元组和包含类的属性和方法的字典。通过调用type类的构造函数,可以动态地创建一个新的类对象。
例如,下面的代码使用type类创建了一个名为MyClass的新类:

MyClass = type('MyClass', (object,), {'x': 42, 'foo': lambda self: x+1})

该类没有显式的定义,而是通过type类的构造函数动态创建的。这个类具有一个属性x和一个方法foo。object表示要继承的基类,可为空
上述代码与下面的是等价的:

class Myclass(object):
	x=42
	def foo(self):
		return x+1

Type做为元类(metaclass)

元类的作用

在Python中,每个类都有一个元类,用于控制类的创建和行为。默认情况下,大部分类的元类都是type类,元类允许你在创建类时定制类的行为。通过定义自己的元类,你可以控制类的创建过程,包括修改类的属性、添加方法、拦截方法调用等

如何自定义元类

定义自定义元类,你需要创建一个类,并将其指定为你要创建的类的元类。自定义元类必须继承自type类或type类的子类。

class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        # 在类创建之前执行的逻辑
        # 可以在这里修改类的属性和方法
        modified_attrs = modify_attrs(attrs)
        return super().__new__(cls, name, bases, modified_attrs)

MyMeta类继承自type类,并重写了__new__方法。__new__方法在类创建之前被调用,可以在这里修改类的属性和方法。然后,你可以使用这个自定义元类来创建其他类
使用自定义元类MyMeta创建类MyClass:

class MyClass(metaclass=MyMeta):
    x = 42

    def foo(self):
        return self.x

在类定义中指定了metaclass=MyMeta,这样MyClass的元类就是MyMeta。当创建MyClass类时,Python会使用MyMeta元类的__new__方法来处理类的创建过程

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛涛ALG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值