当前位置: 首页 > java >正文

Python 常用内置函数详解(九):type()函数——获取对象类型或获取一个新的类型对象

目录

  • 一、功能
  • 二、语法和示例

一、功能

type() 函数有两种形式,当只有一个参数时,用于获取对象的类型;当有多个参数时,用于获取新的类型对象。
在这里插入图片描述

二、语法和示例

第一种:

type(object)参数说明: 
1.object: 对象
2.返回值: 返回对象的类型

第二种:

class type(name, bases, dict, **kwds)参数说明: 
1.name: 类的名称
2.bases: 基类的元组
3.dict: 字典,类内定义的命名空间变量
4.返回值: 返回新的类型对象

【示例1】使用type()函数分别输出不同类型对象的数据类型,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2025-05-01 18:15
# @Author  : AmoXiang
# @File    : type_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680print(type('amo'))  # 输出字符串对象的数据类型
print(type((1, 2, 3, 4, 5)))  # 输出元组对象的数据类型
print(type([1, 2, 3, 4, 5]))  # 输出列表对象的数据类型
print(type({'age': 18, 'gender': '女'}))  # 输出字典对象的数据类型
print(type({1, 2, 3, 4, 5}))  # 输出集合对象的数据类型

【示例2】比较type()函数和isinstance()函数的区别。isinstance()函数也可以用于判断数据类型的,它与type()函数的区别如下:1.相同点:type()函数和isinstance()函数都能判断对象的数据类型。代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2025-05-01 18:15
# @Author  : AmoXiang
# @File    : type_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680d = {'name': 'andy', 'age': 18}
print(type(d))  # 输出对象的数据类型
print(isinstance(d, dict))  # 检测对象的数据类型是不是字典
print(isinstance(d, str))  # 检测对象的数据类型是不是字符串

2.不同点:这两个函数的不同点主要区别在检测某一实例化对象是否属于某一类的时,isinstance()能够判断出子类的实例化对象属于父类,但是type()则不会得出这个结果,它不会认为子类的实例化对象和它父类相同。代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2025-05-01 18:15
# @Author  : AmoXiang
# @File    : type_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680class Foo(object):passclass Bar(Foo):passprint(type(Bar()) == Foo)
print(isinstance(Bar(), Foo))

【示例3】使用 raise 输出错误数据类型。程序在检测类型异常时,为了能更清晰地说明错误原因,通常会使用type()函数获取数据的类型。例如,在将字符串和字节进行转化的过程中,就使用到了type()函数。代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2025-05-01 18:15
# @Author  : AmoXiang
# @File    : type_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680import sysdef encode(value):"""将字符串编码成字节类型"""if not isinstance(value, str):# 抛出异常,说明数据类型异常raise TypeError("str expected, not %s" % type(value).__name__)return value.encode(encoding, 'surrogateescape')if __name__ == "__main__":encoding = sys.getfilesystemencoding()print(f'当前文件编码格式是:{encoding}')encode_value = encode('123')print(f'字符串"123"被encode()函数编码后是:{encode_value}')print('数字123被encode编码')encode_value = encode(123)print(f'数字123被encode()函数编码后是:{encode_value}')

【示例4】使用 assert 输出错误数据类型。程序在检测类型异常时,可以使用 assert 输出错误数据的类型。例如,检测字典的键和值是否都为字符串。代码如下:

dict_val = {'name':'andy','age':18}
for key, value in dict_val.items():assert type(key) is str, '%r is not a string' % keyassert type(value) is str, '%r is not a string' % value

【示例5】分别使用class和type(name,bases,dict)创建类对象。type()函数有多个参数时,可以用于动态创建一个新的类型对象。这与使用class关键字创建类相似。下面分别使用这两种方式创建类对象。1.使用class 关键字创建类。创建一个User类,包含3个函数,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2025-05-01 18:15
# @Author  : AmoXiang
# @File    : type_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680class User(object):def __init__(self, name, age):self.name = nameself.age = agedef get_name(self):print("我的名字是{}".format(self.name))def get_age(self):print("我的年龄是{}".format(self.age))user = User('Andy', 18)
user.get_name()
user.get_age()

2.使用type()函数动态创建类对象。同样可以使用type()函数来动态的创建类对象,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2025-05-01 18:15
# @Author  : AmoXiang
# @File    : type_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680def __init__(self, name, age):# 实例属性self.name = nameself.age = agedef get_name(self):print("我的名字是{}".format(self.name))def get_age(self):print("我的年龄是{}".format(self.age))User = type('User', (object,), {'__init__': __init__, 'get_name': get_name, 'get_age': get_age})
user = User('Andy', 18)
user.get_name()
user.get_age()

【示例6】场景一:结合__new__()方法创建元类。在使用元类来创建类时,需要在元类中执行如下过程:①拦截类的创建②修改类③返回修改之后的类,可以使用type()函数结合__new__()方法来实现。代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2025-05-01 18:15
# @Author  : AmoXiang
# @File    : type_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680class Meta(type):def __new__(meta, classname, bases, attrs):print('调用Meta类的__new__方法:', classname, bases, attrs, sep='\n...')return type.__new__(meta, classname, bases, attrs)class Animal:def __init__(self):print('调用Animal类的__init__方法')print('创建类')class Dog(Animal, metaclass=Meta):age = 5def run(self):print('狗可以奔跑')print('创建实例')
dog = Dog()
dog.run()
print('age:', dog.age)

创建Dog类时,使用metaclass属性声明Dog类是通过元类创建,会先执行Meta类的__new__()方法,返回一个type()函数创建的新类。而在实例化Dog()类时,会调用父类Animal的__init__()方法。

http://www.xdnf.cn/news/3351.html

相关文章:

  • RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(上)
  • 2025华东杯数学建模B题完整分析论文(共36页)(含模型、代码、数据)
  • 分享5款开源、美观的 WinForm UI 控件库
  • 【Linux网络】I/O多路转接技术 - poll
  • DAY01:Vue零基础入门:环境搭建与核心语法深度解析
  • 数据库Mysql_约束
  • 第二章 日志分析-apache日志分析(玄机系列)
  • 【论文阅读26】贝叶斯-滑坡预测-不确定性
  • 图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别
  • 基于Redis实现-用户签到
  • C++——入门基础(2)
  • podman/docker国内可用的docker镜像源(2025-05)
  • 前端八股 3
  • Linux-04-搜索查找类命令
  • WPF实现数据库操作与日志记录
  • 工行手机银行安全吗?在应用商店下载工商银行安全吗?
  • 工 厂 模 式
  • 17. LangChain流式响应与实时交互:打造“类ChatGPT“体验
  • 数字智慧方案5974丨智慧农业大数据应用平台综合解决方案(79页PPT)(文末有下载方式)
  • 数据结构与算法学习笔记(Acwing提高课)----动态规划·背包模型(二)
  • 经典算法 青蛙跳杯子
  • 【大模型实战篇】华为信创环境采用vllm部署QwQ-32B模型
  • 【MySQL】复合查询与内外连接
  • 补题( Convolution, 二维卷积求输出矩阵元素和最大值)
  • 【方案分享】基于Three.js和Stencil Buffer的AR实物遮挡方案,支持不规则动态区域(AR地下设施、AR虚实遮挡)
  • 前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
  • ruoyi-plus Spring Boot + MyBatis 中 BaseEntity 的设计与动态查询实践
  • AVDictionary 再分析
  • 安全学习基础入门5集
  • curl详解