type()
函数通常被用来判断对象的类型,在传入三个参数的时候它可以用来动态创建类。
本文着重介绍传入一个参数的情况,动态创建类请移步:python type()函数专题——动态创建类
另一个函数isinstance()
方法也可以用来判断对象的类型。
isinstance()
与type()
区别:
type()
不会认为子类是一种父类类型,不考虑继承关系。
isinstance()
会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()
。
以下是type()
方法的语法:
type(object)
# 或者
type(name, bases, dict)
单参数情况:
三参数情况:
单参数情况:返回这个对象的类型
三参数情况:返回一个新的类型对象(一个动态创建的类)。
以下展示了使用 type()
函数判断对象类型的实例:
print("数值对象的变量类型:")
print(type(1))
print('字符串对象的变量类型:')
print(type('W3Cschool'))
print('列表对象的变量类型:')
print(type([2]))
print('元组对象的变量类型:')
print(type((1,2)))
print('字典对象的变量类型:')
print(type({0:'zero'}))
print('判断两个对象的类型是否相等')
x = 1
print(type(x) == int)
运行结果如下:
数值对象的变量类型:
<class 'int'>
字符串对象的变量类型:
<class 'str'>
列表对象的变量类型:
<class 'list'>
元组对象的变量类型:
<class 'tuple'>
字典对象的变量类型:
<class 'dict'>
判断两个对象的类型是否相等
True
以下展示了使用type()
函数动态创建一个类的代码:
class Animal():
#一个父类,用来被继承的类。通常我们使用都是直接继承object类,但这边为了直观所以自己弄了一个类
#这个父类有一个name属性,一个get_name方法,一个breathe方法
name = ""
def __init__(self,name):
self.name = name
def get_name(self):
return self.name
def breathe():
print("我可以呼吸")
#使用动态创建类的方法创建一个people类,继承了animal类,需要多一个属性sex
People = type("People",(Animal,) , {'sex':'M'}) # 我们定义了一个新类叫People,他继承于animal类,多了一个新的属性sex
human = People('男人') #实例化这个类,让我们来看看他有什么表现吧
print(type(human)) # 返回类People的实例化对象human 的类型<class '__main__.People'>)
print(dir(human)) #用来查看这个类有什么属性或方法
#我们使用的是dir方法,虽然看着很复杂,不过我们可以看到乱七八糟的结果里确实有父类的两个方法一个属性,和我们添加进去的sex属性
# 当然也可以自己使用以下这个类的方法和属性,这里我只想证明存在这些内容,不多做功能展示
# 使用动态创建了的方法创建一个Bird类,继承于animal类,需要多一个fly的方法
def fly(self):
print("我可以飞")
Bird = type('Bird', (Animal,), {'fly': fly}) #我们定义了一个新类叫Bird,继承于Animal类,多了一个新的方法fly
bird =Bird('乌鸦') # 实例化这个类,让我们看到他有什么表现吧
print(type(bird)) # 返回类Bird的实例化对象bird的类型 <class '__main__.Bird'>)
print(dir(bird)) # 用来查看这个类有什么属性或方法
bird.fly() # 试用一下这个fly方法,看它是否实现了功能
#使用动态创建类的方法创建一个Durk类,继承于animal类,需要多一个属性weight和一个方法fly()
Durk = type("Durk",(Animal,),{"weight":0,"fly":fly}) #我们定义了一个新类叫Durk,继承于Animal类,多了一个新的方法fly()和一个新属性weight
callDuck = Durk('柯尔鸭') #实例化这个类,让我们看到他有什么表现吧
print(type(callDuck)) # 返回类Durk的实例化对象callDark的类型 <class '__main__.Dark'>)
print(dir(callDuck)) # 用来查看这个类有什么属性或方法
运行结果如下:
<class '__main__.People'>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'breathe', 'get_name', 'name', 'sex']
<class '__main__.Bird'>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'breathe', 'fly', 'get_name', 'name']
我可以飞
<class '__main__.Durk'>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'breathe', 'fly', 'get_name', 'name', 'weight']
type()
与isinstance()
区别:
class A:
pass
class B(A):
pass
isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False