Python中一切皆物件
本章節首先對比靜態語言以及動態語言,然後介紹 python 中最底層也是物件導向最重要的幾個概念-object、type和class之間的關係,以此來引出在python如何做到一切皆物件、隨後列舉python中的常見物件。
1.Python中一切皆物件
Python的物件導向更徹底,Java和C++中基礎型別並不是物件。在Python中,函式和類也是物件,屬於Python的一等公民。
物件
具有如下4個特徵
- 1.賦值給一個變數
- 2.可以新增到集合物件中
- 3.可以作為引數傳遞給函式
- 4.可以作為函式地返回值
下面從四個特徵角度分別舉例說明函式和類也是物件
1.1 類和函式都可以賦值給一個變數
類可以賦值給一個變數
class Person:
def __init__(self, name="lsg"):
print(name)
if __name__ == '__main__':
my_class = Person # 類賦值給一個變數
my_class() # 輸出lsg,變數直接呼叫就可以例項化一個類,滿足上面的特徵1,這裡顯然說明類也是一個物件
my_class("haha") # 輸出haha
函式可以賦值給一個變數
def func_test(name='lsg'):
print(name)
if __name__ == '__main__':
my_func = func_test
my_func("haha") # 輸出haha,對變數的操作就是對函式的操作,等效於物件的賦值,滿足上面的特徵1,說明函式是物件。
1.2 類和函式都可以新增到集合中
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'>]
1.3 類和函式都可以作為引數傳遞給函式
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'>
可以明顯地看出類和函式都是物件
1.4 類和函式都可以作為函式地返回值
class Person:
def __init__(self, name="lsg"):
print(name)
def func_test(name='lsg'):
print(name)
def decorator_func():
print("pre function")
return func_test
def decorator_class():
print("pre class")
return Person
if __name__ == '__main__':
decorator_func()() # 返回的右值作為函式可以直接呼叫
decorator_class()() # 返回的右值作為類可以直接例項化
2.type、object和class的關係
程式碼舉例如下, 可以得出三者的關係是type --> class --> obj
2.1 type --> int --> a
a = 1
print(type(a)) # <class 'int'>
print(type(int)) # <class 'type'>
2.2 type --> str --> b
b = 'abc'
print(type(b)) # <class 'str'>
print(type(str)) # <class 'type'>
2.3 type --> Student --> stu
class Student:
pass
stu = Student()
print(type(stu)) # <class '__main__.Student'>
print(type(Student)) # <class 'type'>
2.4 type --> list --> c
c = [1, 2]
print(type(c)) # <class 'list'>
print(type(list)) # <class 'type'>
總結圖:
3.Python中常見的內建型別
物件的三個特徵:身份、記憶體和值
- 身份:在記憶體中的地址,可以用
id(變數)
函式來檢視 - 型別:任何變數都必須有型別
- 值
常見的內建型別如下
3.1 None:全域性只有一個
如下程式碼,兩個值為None的變數地址完全相同,可見None是全域性唯一的
a = None
b = None
print(id(a))
print(id(b))
print(id(a) == id(b))
3.2 數值型別
- int
- float
- complex(複數)
- bool
3.3 迭代型別:iterator
3.4 序列型別
- list
- bytes、bytearray、memoryview(二進位制序列)
- range
- tuple
- str
- array
3.5 對映型別(dict)
3.6 集合
- set
- frozenset
3.7 上下文管理型別(with)
3.8 其他
- 模組型別
- class和例項
- 函式型別
- 方法型別
- 程式碼型別
- object型別
- type型別
- elipsis型別
- notimplemented型別
歡迎關注我的公眾號檢視更多文章