Python難點解析---初級篇2.一切皆對象

在剛開始接觸Python的時候,就一直聽到一句話:

一切皆對象

那麼,對於對象他有一些什麼重要的屬性呢。

Python對象的屬性

對於一個對象而言,他首先應該是具備類型這一屬性,那麼類型對應的則是,由於對象都是在內存中生存的,所以他也應該擁有一個地址
因此,作爲一個對象,他會有以下三個屬性:

  • 類型
  • 地址

先看以下代碼,對於一個變量a有以下的定義:

a = 1
b = "hello world"
c = [1,2,3]

print a, type(a), id(a)
print b, type(b), id(b)
print c, type(c), id(c)

output:
1 <type 'int'> 38567656                                                                                                                                                                                                                
hello world <type 'str'> 43878752                                                                                                                                                                                                      
[1, 2, 3] <type 'list'> 43862216

通過type函數可以直接獲得對象的類型。
通過id函數可以直接獲得對象的地址。

一切皆對象

基本數據類型實例是對象

Python有以下幾種基本數據類型:

#數字
1234, 3.14, 1231L, 3+4j, Decimal
#字符串
'hello', "world"
#列表
[1,2,3,4]
#元組
(1, "hello", 2)
#字典
{1 : "hello", 2 : "world"}
#文件
file = open("file.txt", 'r')
#其它類型
集合,類型,None,布爾型

類是對象

除了上面列舉的a,b,c三個是對象,也是一個對象,類是元類的實例。

class C(object):
    def __init__(self):
        pass

print type(C)

>>><type 'type'>

由上面的代碼可以看到,類C是<type ‘type’>的實例,<type ‘type’>是類的類,我們稱爲元類,元類是用來定製類的關鍵。這點暫時不做展開。

函數是對象

除了上面這些,函數也是對象,具體可以看下面的代碼。

def foo():
    print "foo"

a = foo
a()

>>>foo

從代碼中可以看到,函數可以作爲一個對象來進行傳遞,這一特性加上閉包則是Python的語法糖裝飾器

def wrap(func):
    def wrapper(*args, **kwargs):
        print "Hello %s" % func.__name__
        func(*args, **kwargs)

    return wrapper

@wrap
def foo():
    print "foo"

a = foo
a()
>>>Hello foo                                                                                                                                                                                                                              
>>>foo 

裝飾器將函數作爲一個對象傳入,a = wrap(foo),執行的時候則會執行Hello foo的語句然後再執行foo函數,裝飾器是AOP(面向切面編程)的一種用法,可以在不改變函數結構的情況下通過語法糖插入日誌、性能調試等功能。

補充:對象分類

Python的基本數據類型按是否可變可以分爲:

  • 可變數據類型
  • 不可變數據類型

可變數據類型:

指在運行過程中可以更改其值的數據類型,常見的有list(列表)dict(字典)

不可變數據類型:

指在運行過程不可以改變值的數據類型,常見的有tuple(元組)num(數字)str()字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章