輕松學(xué)會(huì)python面向?qū)ο蟮?3篇---填坑,關(guān)于屬性和方法(1)

1. 為何要填坑
本系列文章遵守一個(gè)簡單的原則---不容易解釋的概念,暫時(shí)不解釋,先從代碼形式入手,等大家熟悉這些概念和名詞后,再回來填坑,以確保做到先易后難,循序漸進(jìn)。
因此呢,前面的一些概念,講解的并不準(zhǔn)確。只是在那個(gè)時(shí)候,不準(zhǔn)確的概念更有利于你理解,但隨著學(xué)習(xí)的深入,又必須澄清這些概念,否則,就走錯(cuò)了路。
從這一篇開始,我后續(xù)會(huì)逐步將前面挖的坑填上。
2. 屬性和方法的坑
本系列的第2篇文章,主題便是屬性和方法,文章里對于屬性和方法的介紹非常的粗糙,甚至是不準(zhǔn)確的。
對于屬性,有類屬性和實(shí)例屬性之分。
對于方法,有類方法,實(shí)例方法,靜態(tài)方法之分
本篇重點(diǎn)講解類屬性和實(shí)例屬性
3. 類屬性和實(shí)例屬性
3.1 實(shí)例屬性
class Book():
def __init__(self, _name, _author, _price):
self.name = _name # 書名
self.author = _author # 作者
self.price = _price # 價(jià)格
name,author, price 都是實(shí)例屬性,在本系列第10篇文章里已經(jīng)闡明,屬性屬于對象,對象和實(shí)例在本系列文章中表示同一個(gè)事物。實(shí)例屬性,在對象,實(shí)例被創(chuàng)建出來以后才存在的。上面的代碼,只是定義了一個(gè)類,沒有創(chuàng)建任何實(shí)例對象,這些屬性壓根就不存在,實(shí)例屬性,依附于實(shí)例而存在。
3.2 類屬性
類屬性又是什么東西呢?我定義一個(gè)新的類
class NovelBook():
book_type = "小說"
def __init__(self, _name, _author, _price):
self.name = _name # 書名
self.author = _author # 作者
self.price = _price # 價(jià)格
book_type就是類屬性,它是NovelBook的類屬性,你可以這樣來使用它
print(NovelBook.book_type) # "小說
novel = NovelBook("西游記", '吳承恩', '100')
print(novel.book_type) # 小說
novel.book_type = '言情小說'
print(novel.book_type) # 言情小說
print(NovelBook.book_type) # 小說
NovelBook.book_type = "魔幻小說"
print(NovelBook.book_type) # 魔幻小說
你可以通過類直接訪問類的屬性,也可以通過對象實(shí)例訪問類的屬性,但是你不能通過對象實(shí)例修改類的屬性,因?yàn)轭惖膶傩允菍儆陬惖?,這一點(diǎn)從名稱上就可以看得出來,也因?yàn)槿绱?,你可以通過類來修改類屬性。至于為什么不能通過實(shí)例對象修改類屬性,我后面來填這個(gè)坑。
3.3 實(shí)例屬性只能在類里定義么?
3.1 小節(jié)中的內(nèi)容,可能會(huì)讓你產(chǎn)生一個(gè)誤解,以為只有定義在__init__方法里的self.XXX才是實(shí)例屬性,實(shí)際情況不是這樣,我下面舉兩個(gè)例子
class NovelBook():
book_type = "小說"
def __init__(self, _name, _author, _price):
self.name = _name # 書名
self.author = _author # 作者
self.price = _price # 價(jià)格
def set_page_count(self, count):
self.page_count = count # page_count也是實(shí)例屬性
novel = NovelBook("西游記", '吳承恩', '100')
novel.set_page_count(290)
print(novel.page_count) # 290
setattr(novel, 'score', 100)
print(novel.score) # 100
page_count不是在__init__方法里定義的,但也是實(shí)例屬性,區(qū)別在于,實(shí)例對象被創(chuàng)建好了以后,就會(huì)自動(dòng)調(diào)用__init__方法進(jìn)行初始化,你可以理解為實(shí)例被創(chuàng)建出來以后,name, author, price就已經(jīng)存在了,而此時(shí)page_count 還不存在,要等到novel對象調(diào)用set_page_count方法時(shí),page_count才會(huì)被創(chuàng)建。
我用setattr函數(shù),強(qiáng)行為示例對象novel增加了一個(gè)socre屬性,所有才能夠用novel.score這種寫法獲取到score屬性。
實(shí)例屬性有這樣的表現(xiàn),你應(yīng)當(dāng)已經(jīng)猜到,類屬性也可以這樣來操作。
3.4 類屬性有什么作用呢?
實(shí)例屬性的作用比較容易理解,類屬性則困難一些,你有這樣的疑惑倒也正常。這里又要給你挖一個(gè)坑,python語言里,一切皆對象,你用class 定義出來的類,比如NovelBook,其實(shí),也是一個(gè)對象,它是type這個(gè)類創(chuàng)建出來的對象,NovelBook也有一些需要被描述的屬性,比如book_type,描述書的類型。
關(guān)于類屬性,對它的思考,不必過于執(zhí)著,暫且從概念上理解到這里。它存在的合理性和必要性,要等到你對編程有更深入的理解和實(shí)踐之后才能夠有所體會(huì),眼下,還是從形式上記住它。
如果你總是嘗試用理解代替記憶,那么你就會(huì)執(zhí)著于尋找具體的應(yīng)用實(shí)例來解答心中的疑惑,通過具體應(yīng)用場景來理解它??墒抢斫饩唧w應(yīng)用實(shí)例需要你自身有堅(jiān)實(shí)的基礎(chǔ)和豐富的知識(shí),這本身又是你目前所欠缺的,這很矛盾。
越是學(xué)習(xí)高階的編程知識(shí),越是無法從現(xiàn)實(shí)生活中尋找到可以類比的事物和概念,即便勉強(qiáng)找到了,也是詞不達(dá)意。進(jìn)入到高階知識(shí)學(xué)習(xí)階段,你必須融入到編程的世界里來,用計(jì)算機(jī)的語言來描述你的問題,用編程語言的語法和概念,逐步的構(gòu)建出一個(gè)虛擬的世界。
這個(gè)世界里,天馬行空,一切超乎尋常的想象,只要符合邏輯,都可以合理的存在。
