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__()方法。