寫一篇Python類的入門文章,在高級(jí)編程語言中,明白類的概念和懂得如何運(yùn)用是必不可少的。文章有點(diǎn)長,3000多字。
Python是面向?qū)ο蟮母呒?jí)編程語言,在Python里面“一切都是對(duì)象”:數(shù)字、字符串、元組、列表、字典、集合等內(nèi)置數(shù)據(jù)類型,以及函數(shù)、方法、類、模塊都是對(duì)象。
class
實(shí)現(xiàn)的,下面是最簡(jiǎn)單的類的定義的樣子:class ClassName:
語句1
...
語句n
語句1
可能是內(nèi)部變量(數(shù)據(jù))的定義和賦值語句,也可能是內(nèi)部方法(函數(shù))的定義語句。類內(nèi)部的函數(shù)定義通常具有一種特別形式的參數(shù)列表,這是方法調(diào)用的約定規(guī)范里面指明的。這個(gè)特別形式就是第一個(gè)參數(shù)必須是self
,后面將詳細(xì)介紹。ClassName
)。ClassName
)支持兩種操作:屬性引用和實(shí)例化。obj.name
。類對(duì)象被創(chuàng)建時(shí)存在于類命名空間內(nèi)的所有名稱都是有效的屬性名稱。下面是一個(gè)包含數(shù)據(jù)和方法的簡(jiǎn)單的類定義:class YuanRenXue:
'''A demo of class'''
name = '猿人學(xué)'
def say_hi(self):
print('Hello world!')
YuanRenXue.name
YuanRenXue.say_hi
,Yuanrenxue.name
的值。__doc__
也是一個(gè)有效的屬性,對(duì)他的引用會(huì)返回所屬類的文檔字符串:'A demo of class'
。yrx = YuanRenXue()
yrx
。__init__()
的特殊方法。它是類實(shí)例化的初始化方法,跟C++語言中 的構(gòu)造函數(shù)類似。def __init__(self):
self.data = None
__init__()
方法后,類的實(shí)例化操作會(huì)自動(dòng)調(diào)用該方法。__init__()
方法也可以有額外(除self之外)的參數(shù)以實(shí)現(xiàn)更靈活的初始化操作。類對(duì)象實(shí)例化時(shí)(“調(diào)用”類對(duì)象)傳遞的參數(shù)會(huì)被傳遞給__init__()
方法。例如:In [27]: class Point:
...: def __init__(self, x, y):
...: self.x = x
...: self.y = y
...:
In [28]: p = Point(7, 8)
In [29]: p.x, p.y
Out[29]: (7, 8)
p
是聲明創(chuàng)建的Point
的實(shí)例,則以下代碼會(huì)打印數(shù)值8
:p.times = 1
while p.times < 5:
p.times = p.times * 2
print(p.times)
del p.times
p.times
并沒有在類定義時(shí)聲明(數(shù)據(jù)屬性不需要聲明),但在任何時(shí)候,我們可以給實(shí)例賦值一個(gè)新的數(shù)據(jù)屬性(這里是p.times
),并可以隨時(shí)刪除實(shí)例的數(shù)據(jù)屬性(del p.times
)。append(), insert(), sort()
等方法。yrx.say_hi
是有效的方法引用,因?yàn)?code>YuanRenXue.say_hi是一個(gè)函數(shù);而yrx.name
不是方法,因?yàn)?code>YuanRenXue.name不是一個(gè)函數(shù)。這里要注意,yrx.say_hi
與YuanRenXue.say_hi
并不是一回事,它是一個(gè)方法對(duì)象,不是函數(shù)對(duì)象,通俗講,前者是實(shí)例的方法,后者是類的函數(shù)。yrx.say_hi()
Hello World
。但是,調(diào)用一個(gè)方法也可以換另外一種形式,把它賦值給一個(gè)變量后再調(diào)用。例如:yrx_say = yrx.say_hi
yrx_say()
yrx.say_hi()
時(shí)并沒有帶參數(shù),但say_hi()
函數(shù)定義時(shí)指定了一個(gè)參數(shù)。實(shí)際上,方法的特殊之處就是實(shí)例對(duì)象會(huì)作為函數(shù)的第一個(gè)參數(shù)(self)被傳入。調(diào)用yrx.say_hi()
其實(shí)就相當(dāng)于YuanRenXue.say_hi(yrx)
。In [33]: class Tiger:
...: kind = 'feline'
...: def __init__(self, name)
File '<ipython-input-33-16aa1a5937d1>', line 3
def __init__(self, name)
^
SyntaxError: invalid syntax
In [34]: class Tiger:
...: kind = 'feline'
...: def __init__(self, name):
...: self.name = name
...:
In [35]: a = Tiger('Kiro')
In [36]: b = Tiger('Zim')
In [37]: a.kind
Out[37]: 'feline'
In [38]: b.kind
Out[38]: 'feline'
In [39]: a.name
Out[39]: 'Kiro'
In [40]: b.name
Out[40]: 'Zim'
In [42]: class Tiger:
...: places = []
...: def __init__(self, name):
...: self.name = name
...: def go_place(self, place):
...: self.places.append(place)
...:
In [43]: a = Tiger('Kiro')
In [44]: b = Tiger('Zim')
In [45]: a.go_place('北京')
In [46]: b.go_place('上海')
In [47]: a.places
Out[47]: ['北京', '上海']
places
定義為類變量,它就記錄了所有老虎(Kiro和Zim,以及后面實(shí)例化出來個(gè)各個(gè)老虎)去過的地方,所以,盡管a
只去過北京,但是當(dāng)我們通過a
查看places
,也看到了上海。這就是可變對(duì)象作為類變量時(shí)的特性。如果我們就是想記錄所有老虎實(shí)例對(duì)象去過的地方,這樣的用法就是恰到好處。places
定義為實(shí)例變量,也就是在__init__()
中進(jìn)行初始化賦值。self
,代表實(shí)例對(duì)象。但這只是大家普通認(rèn)同的一個(gè)約定。你可以用任何單詞來替代它,但是你的代碼讓氣體程序員讀起來就很費(fèi)勁,也會(huì)對(duì)VS Code這樣的編輯器造成困惑。聯(lián)系客服