Python3 type() 函數(shù) - 判斷對(duì)象的類(lèi)型

2023-04-21 16:37 更新

Python 內(nèi)置函數(shù) Python 內(nèi)置函數(shù)


描述

?type() ?函數(shù)通常被用來(lái)判斷對(duì)象的類(lèi)型,在傳入三個(gè)參數(shù)的時(shí)候它可以用來(lái)動(dòng)態(tài)創(chuàng)建類(lèi)。

本文著重介紹傳入一個(gè)參數(shù)的情況,動(dòng)態(tài)創(chuàng)建類(lèi)請(qǐng)移步:python type()函數(shù)專(zhuān)題——?jiǎng)討B(tài)創(chuàng)建類(lèi)

另一個(gè)函數(shù)?isinstance()?方法也可以用來(lái)判斷對(duì)象的類(lèi)型。

?isinstance() ?與? type()? 區(qū)別:
?type()? 不會(huì)認(rèn)為子類(lèi)是一種父類(lèi)類(lèi)型,不考慮繼承關(guān)系。
?isinstance()? 會(huì)認(rèn)為子類(lèi)是一種父類(lèi)類(lèi)型,考慮繼承關(guān)系。
如果要判斷兩個(gè)類(lèi)型是否相同推薦使用 ?isinstance()?。

語(yǔ)法

以下是? type() ?方法的語(yǔ)法:

type(object)
# 或者
type(name, bases, dict)

參數(shù)

單參數(shù)情況:

  • object:一個(gè)對(duì)象

三參數(shù)情況:

  • name:要?jiǎng)討B(tài)創(chuàng)建的類(lèi)的名稱(chēng)。
  • bases:繼承于哪個(gè)父類(lèi)(這是一個(gè)元組?。?。
  • dict:要添加的屬性和方法(這是一個(gè)字典!)

返回值

單參數(shù)情況:返回這個(gè)對(duì)象的類(lèi)型

三參數(shù)情況:返回一個(gè)新的類(lèi)型對(duì)象(一個(gè)動(dòng)態(tài)創(chuàng)建的類(lèi))。


實(shí)例

以下展示了使用 ?type()? 函數(shù)判斷對(duì)象類(lèi)型的實(shí)例:

print("數(shù)值對(duì)象的變量類(lèi)型:")
print(type(1))

print('字符串對(duì)象的變量類(lèi)型:')
print(type('W3Cschool'))

print('列表對(duì)象的變量類(lèi)型:')
print(type([2]))

print('元組對(duì)象的變量類(lèi)型:')
print(type((1,2)))

print('字典對(duì)象的變量類(lèi)型:')
print(type({0:'zero'}))

print('判斷兩個(gè)對(duì)象的類(lèi)型是否相等')
x = 1
print(type(x) == int)

運(yùn)行結(jié)果如下:

數(shù)值對(duì)象的變量類(lèi)型:
<class 'int'>
字符串對(duì)象的變量類(lèi)型:
<class 'str'>
列表對(duì)象的變量類(lèi)型:
<class 'list'>
元組對(duì)象的變量類(lèi)型:
<class 'tuple'>
字典對(duì)象的變量類(lèi)型:
<class 'dict'>
判斷兩個(gè)對(duì)象的類(lèi)型是否相等
True

以下展示了使用?type()?函數(shù)動(dòng)態(tài)創(chuàng)建一個(gè)類(lèi)的代碼:

class Animal(): 
    #一個(gè)父類(lèi),用來(lái)被繼承的類(lèi)。通常我們使用都是直接繼承object類(lèi),但這邊為了直觀所以自己弄了一個(gè)類(lèi)
    #這個(gè)父類(lèi)有一個(gè)name屬性,一個(gè)get_name方法,一個(gè)breathe方法
    name = ""
    def __init__(self,name):
        self.name = name
    

    def get_name(self):
        return self.name 
    
    
    def breathe():
        print("我可以呼吸")

#使用動(dòng)態(tài)創(chuàng)建類(lèi)的方法創(chuàng)建一個(gè)people類(lèi),繼承了animal類(lèi),需要多一個(gè)屬性sex  
People = type("People",(Animal,) , {'sex':'M'}) # 我們定義了一個(gè)新類(lèi)叫People,他繼承于animal類(lèi),多了一個(gè)新的屬性sex
human = People('男人') #實(shí)例化這個(gè)類(lèi),讓我們來(lái)看看他有什么表現(xiàn)吧

print(type(human))  # 返回類(lèi)People的實(shí)例化對(duì)象human 的類(lèi)型<class '__main__.People'>)
print(dir(human))  #用來(lái)查看這個(gè)類(lèi)有什么屬性或方法
#我們使用的是dir方法,雖然看著很復(fù)雜,不過(guò)我們可以看到亂七八糟的結(jié)果里確實(shí)有父類(lèi)的兩個(gè)方法一個(gè)屬性,和我們添加進(jìn)去的sex屬性
# 當(dāng)然也可以自己使用以下這個(gè)類(lèi)的方法和屬性,這里我只想證明存在這些內(nèi)容,不多做功能展示

# 使用動(dòng)態(tài)創(chuàng)建了的方法創(chuàng)建一個(gè)Bird類(lèi),繼承于animal類(lèi),需要多一個(gè)fly的方法
def fly(self):
    print("我可以飛")

Bird = type('Bird', (Animal,), {'fly': fly}) #我們定義了一個(gè)新類(lèi)叫Bird,繼承于Animal類(lèi),多了一個(gè)新的方法fly

bird =Bird('烏鴉')           # 實(shí)例化這個(gè)類(lèi),讓我們看到他有什么表現(xiàn)吧
print(type(bird))            # 返回類(lèi)Bird的實(shí)例化對(duì)象bird的類(lèi)型 <class '__main__.Bird'>)
print(dir(bird))             # 用來(lái)查看這個(gè)類(lèi)有什么屬性或方法
bird.fly()                   # 試用一下這個(gè)fly方法,看它是否實(shí)現(xiàn)了功能

#使用動(dòng)態(tài)創(chuàng)建類(lèi)的方法創(chuàng)建一個(gè)Durk類(lèi),繼承于animal類(lèi),需要多一個(gè)屬性weight和一個(gè)方法fly()
Durk = type("Durk",(Animal,),{"weight":0,"fly":fly}) #我們定義了一個(gè)新類(lèi)叫Durk,繼承于Animal類(lèi),多了一個(gè)新的方法fly()和一個(gè)新屬性weight
callDuck =  Durk('柯?tīng)桒?) #實(shí)例化這個(gè)類(lèi),讓我們看到他有什么表現(xiàn)吧
print(type(callDuck))            # 返回類(lèi)Durk的實(shí)例化對(duì)象callDark的類(lèi)型 <class '__main__.Dark'>) 
print(dir(callDuck))             # 用來(lái)查看這個(gè)類(lèi)有什么屬性或方法  

運(yùn)行結(jié)果如下:

<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']

補(bǔ)充

?type() ?與? isinstance()?區(qū)別:

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

Python 內(nèi)置函數(shù) Python 內(nèi)置函數(shù)



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)