熱線電話:13121318867

登錄
首頁大數據時代懵了!python中,type()是函數還是一個類?
懵了!python中,type()是函數還是一個類?
2020-07-23
收藏

現在python學習可是潮流,相信很多小伙伴目前都在學習或者正準備學習python的路上。雖然說python語言相對比較簡單,上手很容易,但是對于一些零基礎的小白來說還是比較難的,在學習過程中會遇到各種各樣的問題。小編今天跟大家分享的這篇文章就是對于python中type()這一知識點的講解,希望對于大家學習和使用python有所幫助。

以下文章來源: Python之禪

作者:劉志軍

知乎有個很有意思的問題,type()是函數還是類,萌新遇到這個問題還真有點懵。

先說結論,type 不是函數(對象), type 是類(對象),而且是元類(不理解什么是元類的先忽略),但我們平常說它是函數問題也不大。

直接打印type看看是什么鬼

>>> type
<class 'type'>
>>>

和自定義類一樣,都是類(class)

>>> class Person:
...     pass
...
>>> Person
<class '__main__.Person'>

而函數是這樣的

>>> def fun():
...     pass
...
>>> fun
<function fun at 0x0000021636AD4A68>
>>>

函數和類都是callable對象,callable 叫可調用對象,所謂可調用對象就是可以被調用(后面有一對括號)例如:

fun()
sum(xxx)
type(xxx)

判斷一個對象是不是callable對象可以使用函數:

>>> callable(type)
True
>>> callable(str)
True
>>> callable("abc")
False

很多人誤以為只要可被調用就是函數,其實類也被調用,實例對象也可以被調用。只要實現了__call__方法的對象都是可被調用對象。

回答了問題后,再來說說type的作用

type的第一個作用是用來查看對象的類型,格式是:

type(object)

例如:

>>> type(1)
<class 'int'>
>>> type([])
<class 'list'>
>>> type({})
<class 'dict'>
>>>

不過,平常我們判斷對象的類型通常會使用 isinstance 函數

>>> isinstance(1, int)
True
>>> isinstance(True, int)
True
>>> isinstance(True, bool)
True

用isinstance的好處是能處理子類的情況,你看,True 既是bool類型也是int類型,因為 bool是int的子類。

type 的第二個作用是用來創建類的

我們知道,實例對象是類創建的,那類又是誰創建的呢,答案是元類。舉個例子吧

>>> type(1)
<class 'int'>
>>> type(int)
<class 'type'>

整數1是實例對象,它是由int類創建的,而int類也是個對象(萬物皆對象),它由誰創建的,是 type 類。

type 就是元類,用來創建類的類就是元類。

平常我們都是使用關鍵字 class 來定義類,例如:

>>> class Foo:
...     a = 1
...

其實,我們還可以用type來創建類,不是說過type是元類嘛。

格式是:

type(name, bases, dict)

name 是類的名字, bases 是要繼承的父類集合, dict 是這個類的屬性集合。
現在我們用 type 函數來創建它 。

<class '__main__.Foo'>
>>> Foo = type("Foo", (object,), {"a":1})
>>> Foo
<class '__main__.Foo'>
>>> Foo.a
1

看到了嗎,用type創建的類其實和前面用class關鍵字創建的類效果是一樣的。

那么什么時候會用到元類呢?

“元類就是深度的魔法,99%的用戶應該根本不必為此操心。如果你想搞清楚究竟是否需要用到元類,那么你就不需要它。那些實際用到元類的人都非常清楚地知道他們需要做什么,而且根本不需要解釋為什么要用元類?!?nbsp; —— Python界的領袖 Tim Peters

1%就是那些寫框架的人。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢