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/xw1680


print(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/xw1680


d = {'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/xw1680


class Foo(object):
    pass


class Bar(Foo):
    pass


print(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/xw1680

import sys


def 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' % key
    assert 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/xw1680

class User(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def 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/xw1680


def __init__(self, name, age):
    # 实例属性
    self.name = name
    self.age = age


def 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/xw1680

class 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 = 5

    def run(self):
        print('狗可以奔跑')


print('创建实例')
dog = Dog()
dog.run()
print('age:', dog.age)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Amo Xiang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值