在剛開始接觸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()字符串