【Python核心程式設計筆記】一、Python中一切皆物件

梁山廣發表於2021-02-18

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

總結圖:
file

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型別

歡迎關注我的公眾號檢視更多文章

空無一悟

相關文章