python中的一切皆對象
1、函數和類是對象,是Python中的一級公民
(1)將函數和類賦值給一個變量
將函數或類賦值給一個變量,就可以把該變量當成函數或類來使用
1 def ask(name): 2 print(name) 3 class Person: 4 def __init__(self): 5 print("hello bobby") 6 print("-----函數賦值給變量-------") 7 my_func = ask 8 # 變量當成函數使用 9 my_func("bobby") 10 print("---------類賦值給變量-----") 11 my_class = Person 12 # 變量當成類使用 13 # 類實例化即會調用初始化函數 14 my_class()
(2)可以將對象(函數和類)添加到集合對象中
def ask(name="bobby"): print(name) class Person: def __init__(self): print("hello bobby") print("-----函數和類可以添加到集合對象中去---") obj_list = [] obj_list.append(ask) obj_list.append(Person)for item in obj_list: #打印函數和類中的東西,並且打印它們返回的東西 print(item()) ‘‘‘ 輸出結果 bobby None---ask()函數沒有返回值,故函數返回None hello bobby <__main__.Person object at 0x0219F8D0>-----類的返回(實際是init函數的返回),Person()實例化後返回一個對象(函數返回對象) ‘‘‘
(3)補充實例:函數可以返回None,可以返回一個對象,也可以返回一個函數(裝飾器實現原理)
def ask(name="bobby"): print(name) print("-----函數可以返回一個函數---") def decorator_func(): print("我是一個函數") return ask my_ask = decorator_func() my_ask("Tom") ‘‘‘ 輸出結果 我是一個函數 Tom ‘‘‘
(4)函數和類可以作為參數傳遞給函數
def ask(name="bobby"): print("傳遞一個函數") class Person: def __init__(self): print("傳遞一個類") print("---函數和類可以作為參數傳遞給函數---") def chuandi(content): content() # 傳遞函數 chuandi(ask) # 傳遞類 chuandi(Person) ‘‘‘ 輸出結果 傳遞一個函數 傳遞一個類 ‘‘‘
(5)函數和類可以當作函數的返回值
def ask(name="bobby"): print(name) class Person: def __init__(self): print("返回一個類") print("-----函數可以返回一個函數和類---") def decorator_func(): print("我是一個函數") return ask my_ask = decorator_func() my_ask("返回一個函數") def decorator_func1(): print("我是一個函數") return Person my_person = decorator_func1() my_person() ‘‘‘ 輸出結果 我是一個函數 返回一個函數 我是一個函數 返回一個類 ‘‘‘
2、type、object和class的關系
(1)type->class->obj
類(class)是由type類生成的一個對象,平時所熟悉的對象obj是由類(class)對象創建的一個對象
type兩種用法:一,生成一個類;二,返回一個對象的類型
(1.1)返回對象的類型
1是一個int類的對象,類本身也是一個對象,由type(int)知,int是type類的對象,因此生成過程是type->int->1
abc是str類的對象,類本身也是一個對象,由type(str)知,str是type類的對象,因此生成過程是type->str->abc
自己創建的類也符合該邏輯,type生成類對象(內置的類或自定義的類),類對象產生實例
(2)object是所有類都要繼承的最頂層的一個基礎類
__base__查看類的基類
(3)type也是一個類,同時type也是一個對象
type的基類也是object
object是所有類的基類,類同時也是對象,由type(object)知object是由type生成的
object之上,沒有基類
(4)type、class、object關系圖
(4.1)內部類以及自定義類默認繼承object,object是所有類的一個基類,type也繼承它
(4.2)object是type的實例,list等所有的內置類和自定義類都是由type創建的,type創建了所有對象(函數和類等)。如,list是一個類,它也是一個對象的原因在於,它是由type創建的,所以類也是對象(設計原因:類加載到內存後不能修改,而對象則能隨時修改,比較方便)
(4.3)object是type的實例,type繼承了object,type也是type自身的實例,其他都是type的實例,故一切皆對象
object是所有類的基類,所有的類最終往上追溯都繼承它,object繼承為空
type既是一個類又是一個對象,所有的類往上追溯都是由type創建的,包括它自己
python中的一切皆對象