Python type() 语法
type() 是 Python 的一个内置函数,它根据语法的不同,有以下 2 个不同的功能。
- 获取对象的类型(最常用):当传入 1 个参数时,type() 返回该对象的类型(类)。
- 创建一个新的类型:当传入 3 个参数时,type() 可以动态地创建一个新的类对象。
语法:
# 方式 1:获取对象类型
type(object)
# 方式 2:创建新类型
type(name, bases, dict)说明:
在方式 1 中,参数 object 代表的是一个对象。type() 函数会返回 object 对应的类型名。
在方式 2 中,type() 函数接收以下 3 个参数。
name(必选):是一个字符串,表示新类的名称,它会成为 __name__ 属性。bases(可选,默认值:(object,)):是一个元组,表示新类的父类(基类),它会成为 __bases__ 属性。如果没有基类,则使用空元组 ()。dict(可选):是一个字典,表示新类的属性和方法,它会成为 __dict__ 属性。
提示:
- Python 一切皆对象,因此像数字、字符串、列表等本质上也是对象。
- type() 函数是所有 Python 类的元类(metaclass)。也就是说,所有类都是 type 的实例。
- 我们可以使用 type() 或 isinstance() 来检查对象的类型。isinstance() 更推荐用于检查继承关系。
Python type() 摘要
| 使用频率 | 高 |
|---|---|
| 官方文档 | 查看 |
| 相关函数 | isinstance()、issubclass() |
Python type() 示例
接下来,我们通过几个简单的例子来讲解一下 Python type() 函数是如何使用的。
示例 1:type() 带 1 个参数
print(type(666)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type('绿叶网')) # <class 'str'>
print(type([1,2,3])) # <class 'list'>
print(type((1,2,3))) # <class 'tuple'>
print(type({'a':1})) # <class 'dict'>
print(type({1,2})) # <class 'set'>
print(type(True)) # <class 'bool'>
print(type(None)) # <class 'NoneType'>运行结果如下。
<class 'int'>
<class 'float'>
<class 'str'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'set'>
<class 'bool'>
<class 'NoneType'>示例 2:type() 判断自定义对象
class Hero:
name = '剑圣'
h = Hero()
print(type(h))运行结果如下。
<class '__main__.Hero'>示例 3:type() 带 3 个参数
Hero = type('Hero', (object,), dict(name='剑圣'))
h = Hero()
print(type(h))
print(h.name)运行结果如下。
<class '__main__.Hero'>
剑圣分析:
下面两种方式是等价的,都可以用于定义一个名为 Hero 的类。
# 方式 1
class Hero:
name = '剑圣'
# 方式 2
Hero = type('Hero', (object,), dict(name='剑圣'))提示: 对于初学者而言,type(name, bases, dict) 这种语法比较少会用到,简单了解即可。不过 type() 函数可以动态创建类,这在一些高级编程技巧中非常有用。
type() 应用场景
在 Python 中,我们可以使用 type() 函数结合 is 关键字来判断对象是否为某种类型。
示例 4:type() 判断基本类型
result1 = type(666) is int
print(result1)
result2 = type(666) is str
print(result2)运行结果如下。
True
False示例 5:type() 判断自定义对象
class Hero:
name = '剑圣'
h = Hero()
print(type(h) is Hero)运行结果如下。
Truetype() 高级用法
在 Python 中,type() 函数 不仅可以用于获取对象的类型,还可以动态创建类。通过 type() 函数,我们可以定义一个类的名称、基类(父类)以及类的属性和方法。
示例 6:type() 动态创建包含方法的类
# 定义类方法
def attack(self):
return f'{self.name}发动攻击!'
# 使用 type() 动态创建类
Warrior = type('Warrior', (), {
'name': '蛮王',
'attack': attack
})
# 创建实例并调用方法
w = Warrior()
print(w.attack())运行结果如下。
蛮王发动攻击!type() 与 isinstance() 的区别
type() 和 isinstance() 这两个函数的功能比较相似,但它们存在本质上的区别。
type():不考虑继承关系,它不会认为子类是一种父类类型。isinstance():考虑继承关系,它会认为子类是一种父类类型。
在实际开发中,如果想要判断两种类型是否相同,更推荐使用 isinstance() 函数。
示例 7:type() vs isinstance()
class Person:
pass
class Student(Person):
pass
s = Student()
print(type(s) is Person) # False(严格类型匹配)
print(isinstance(s, Person)) # True(识别继承关系)运行结果如下。
False
True