本章節(jié)首先對比靜態(tài)語言以及動態(tài)語言,然后介紹 python 中最底層也是面向?qū)ο笞钪匾膸讉€概念-object、type和class之間的關(guān)系,以此來引出在python如何做到一切皆對象、隨后列舉python中的常見對象。
Python的面向?qū)ο蟾鼜氐祝琂ava和C++中基礎(chǔ)類型并不是對象。在Python中,函數(shù)和類也是對象,屬于Python的一等公民。
對象
具有如下4個特征
下面從四個特征角度分別舉例說明函數(shù)和類也是對象
類可以賦值給一個變量
class Person: def __init__(self, name="lsg"): print(name)if __name__ == '__main__': my_class = Person # 類賦值給一個變量 my_class() # 輸出lsg,變量直接調(diào)用就可以實例化一個類,滿足上面的特征1,這里顯然說明類也是一個對象 my_class("haha") # 輸出haha
函數(shù)可以賦值給一個變量
def func_test(name='lsg'): print(name)if __name__ == '__main__': my_func = func_test my_func("haha") # 輸出haha,對變量的操作就是對函數(shù)的操作,等效于對象的賦值,滿足上面的特征1,說明函數(shù)是對象。
class Person: def __init__(self, name="lsg"): print(name)def func_test(name='lsg'): print(name)if __name__ == '__main__': obj_list = [func_test, Person] print(obj_list) # 輸出[<function func_test at 0x0000025856A2C1E0>, <class '__main__.Person'>]
class Person: def __init__(self, name="lsg"): print(name)def func_test(name='lsg'): print(name)def print_type(obj): print(type(obj))if __name__ == '__main__': print_type(func_test) print_type(Person)
輸出如下
<class 'function'><class 'type'>
可以明顯地看出類和函數(shù)都是對象
class Person: def __init__(self, name="lsg"): print(name)def func_test(name='lsg'): print(name)def decorator_func(): print("pre function") return func_testdef decorator_class(): print("pre class") return Personif __name__ == '__main__': decorator_func()() # 返回的右值作為函數(shù)可以直接調(diào)用 decorator_class()() # 返回的右值作為類可以直接實例化
代碼舉例如下, 可以得出三者的關(guān)系是type --> class --> obj
a = 1print(type(a)) # <class 'int'>print(type(int)) # <class 'type'>
b = 'abc'print(type(b)) # <class 'str'>print(type(str)) # <class 'type'>
class Student: passstu = Student()print(type(stu)) # <class '__main__.Student'>print(type(Student)) # <class 'type'>
c = [1, 2]print(type(c)) # <class 'list'>print(type(list)) # <class 'type'>
總結(jié)圖:
對象的三個特征:身份、內(nèi)存和值
id(變量)
函數(shù)來查看常見的內(nèi)置類型如下
如下代碼,兩個值為None的變量地址完全相同,可見None是全局唯一的
a = Noneb = Noneprint(id(a))print(id(b))print(id(a) == id(b))
歡迎關(guān)注我的公眾號查看更多文章