天天看點

python中一切皆對象

python中一切皆對象

  • python中的一切皆對象更加徹底

    在python中的一切皆對象比Java中的一切皆對象更加徹底,Java中有class,也就是類的概念,object是class的一個執行個體。

函數和類也是對象

  • 可以指派給一個變量
# 函數可以指派給一個變量
def ask(name='sixkery'):
    print(name)

my_func = ask # 函數賦給變量
my_func() # 把函數當變量來使用
控制台輸出:
sixkery
           
# 類也可以指派給一個變量
class Person():
    def __init__(self):
        print("sixkery")

my_func = Person # 類賦給變量
my_func() # 對變量的操作執行個體化
控制台輸出:
sixkery
           
  • 可以添加到一個集合中
def ask(name='sixkery'):
    print(name)

class Person():
    def __init__(self):
        print("sixkery1")

obj_list = []
obj_list.append(ask)
obj_list.append(Person)
for item in obj_list:
    print(item())
控制台輸出:
sixkery
None
sixkery1
<__main__.Person object at 0x03C88B70>
           

出現None是因為一個函數沒有傳回值會傳回None,init傳回一個類的對象。

  • 可以作為參數傳遞給函數
  • 可以當作函數的傳回值

    函數可以傳回一個函數實際上是python中的裝飾器的實作原理。

def ask(name='sixkery'):
    print(name)

def decorator_fubc():
    print('dec start')
    return ask

my_ask = decorator_fubc()
my_ask()
控制台輸出:
dec start
sixkery

           

這樣就實作了一個函數通路另一個函數。

type、object、class 的關系

python中一切皆對象

三者關系

圖中虛線代表執行個體關系,實線表示繼承關系,從這個圖中得出幾點:

  1. list、str、dict、tuple、type都繼承了object,是以object是最頂層的基類
  2. type是本身的對象(執行個體),object、list、str、dict、tuple都是type的對象,是以type建立了所有的對象
  3. 綜合1、2可知,一切皆對象的同時又繼承了object類,這就是python的靈活之處,Python的面向對象更加徹底

下面是驗證的例子, #後面表示運作結果

type建立了所有的對象

a = 1
print(type(a))   # <class 'int'>
print(type(int)) # <class 'type'>
           

type->int->1 即type類生成int,int類生成了1。

s = 'abc'
print(type(s))        # <class 'str'>
print(type(str))      # <class 'type'>
           

type->str->’abc’

是以type可以生成class(類), class生成obj(對象)

以上是内置類,現在我們自己建立來看下。

class Student:
    pass

stu = Student()
print(type(stu))          # <class '__main__.Student'>
print(type(Student))      # <class 'type'>

           

結果和上面的情況一樣,type->Student->stu

class Student:
    pass

#Student繼承了最頂層的object同時Student又是type的對象
Student.__bases__         # <class 'object',>
print(type(Student))      # <class 'type'>

#type是自身的對象,object是type的對象
print(type(type))        # <class 'type'>
print(type(object))      # <class 'type'>

#type繼承了object類,最頂層的object的基類為空
print(type.__bases__)      # <class 'object'>
print(object.__bases__)     # ()

           

python中的常見内置類型

python中一切皆對象

常見類型

對象的三個特征

  • 身份

    身份可以了解成在記憶體中的位址,可以通過 id() 函數檢視某一個對象的身份,因為對象是配置設定在記憶體當中的。相當于指針指向對象。

a = 1
print(id(a)) # a 的位址 1493816368
b = []
print(id(b)) # b 的位址 134273344

           
  • 類型

    比如上方的 a 是 int 類型的,b 的類型是 list 。

  • 上方的 1 就是 a 的值。

python 的類型

None(全局隻有一個)

python在解釋器啟動的時候生成一個None 對象。

In [1]: a = None

In [2]: b = None

In [3]: id(a) == id(b)
Out[3]: True

           

這裡 a 和 b 都指向python解釋器中唯一的一個None對象。

數值
  • int
  • float
  • complex(複數)
  • bool(True/False)
疊代類型

可以用for循環來周遊

序列類型
  • list
  • bytes、bytearray、memonyview(二進制序列)
  • range
  • tuple
  • str
  • array
映射類型

dict 字典,有key-value

集合
  • set
  • frozenset(不可變類型)
上下文管理類型

也就是 with 語句

其他
  • 子產品類型、 class和執行個體、 函數類型、方法類型、代碼類型、object對象、type類型、elipsis(省略号) 類型、notimplemented類型