第九章(一)
面向?qū)ο缶幊淌亲钣行У能浖帉?xiě)之一勒葱±送簦基于類(lèi)創(chuàng)建對(duì)象時(shí),每個(gè)對(duì)象都自動(dòng)具備這種通用行為凛虽,然后可根據(jù)需要賦予每個(gè)對(duì)象獨(dú)特的個(gè)性死遭。根據(jù)類(lèi)來(lái)創(chuàng)建對(duì)象被稱(chēng)為實(shí)例化。
1凯旋、創(chuàng)建和使用類(lèi)
創(chuàng)建表示小狗的簡(jiǎn)單類(lèi)——它表示的不是特定的小狗呀潭,而是任何的小狗。
(1)創(chuàng)建Dog類(lèi)
根據(jù)Dog類(lèi)創(chuàng)建的每個(gè)實(shí)例都將存儲(chǔ)名字和年齡至非,并賦予了每條小狗蹲下(sit())和打滾(roll_over())的能力:
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + " is now sitting.")
def roll_over(self):
print(self.name.title() + " rolled over!")
根據(jù)約定钠署,在Python中,首字母大寫(xiě)的名稱(chēng)指的是類(lèi)荒椭。
方法init():
類(lèi)中的函數(shù)稱(chēng)為方法谐鼎,前面有關(guān)函數(shù)的一切都適用于方法,目前唯一重要的差別是調(diào)用方法的方式戳杀。init()是一個(gè)特殊的方法该面,每當(dāng)你根據(jù)Dog類(lèi)創(chuàng)建新實(shí)例時(shí),Python都會(huì)自動(dòng)運(yùn)行它信卡。在這個(gè)方法的名稱(chēng)中隔缀,開(kāi)頭和末尾各有兩個(gè)下劃線,這是一種約定傍菇,旨在避免Python默認(rèn)方法與普通方法發(fā)生名稱(chēng)沖突猾瘸。其中的形參self必不可少,還必須位于其他形參的前面丢习。Python調(diào)用這個(gè)方法時(shí)牵触,會(huì)自動(dòng)傳入實(shí)參self。每個(gè)與類(lèi)相關(guān)聯(lián)的方法調(diào)用都自動(dòng)傳遞實(shí)參self咐低,它是一個(gè)指向?qū)嵗旧淼囊美克迹寣?shí)例能夠訪問(wèn)類(lèi)中的屬性和方法。每當(dāng)我們根據(jù)Dog類(lèi)創(chuàng)建實(shí)例時(shí)见擦,都只需給self后面的形參提供值钉汗。在它下面定義的變量都有前綴self。以self為前綴的變量都可供類(lèi)中的所有方法使用鲤屡,可以通過(guò)類(lèi)的任何實(shí)例來(lái)訪問(wèn)這些變量损痰。可通過(guò)實(shí)例訪問(wèn)的變量成為屬性酒来。
在Python 2.7中創(chuàng)建類(lèi):
在Python2.7中創(chuàng)建類(lèi)時(shí)卢未,需要在括號(hào)內(nèi)包含單詞object。
class ClassName(object):
(2)根據(jù)類(lèi)創(chuàng)建實(shí)例
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
# 輸出:
My dog's name is Willie.
My dog is 6 years old.
利用前面的Dog類(lèi)創(chuàng)建實(shí)例。在這里辽社,命名的約定很有用:我們通澄扒剑可以認(rèn)為首字母大寫(xiě)的名稱(chēng)指的是類(lèi),而小寫(xiě)的名稱(chēng)指的是根據(jù)類(lèi)創(chuàng)建的實(shí)例滴铅。
訪問(wèn)屬性:
使用句點(diǎn)表示法远荠,這種語(yǔ)法演示了Python如何獲悉屬性的值。Python先找到實(shí)例失息,在查找與這個(gè)實(shí)例相關(guān)聯(lián)的屬性。
調(diào)用方法:
創(chuàng)建實(shí)例后档址,可以使用句點(diǎn)表示法來(lái)調(diào)用類(lèi)中定義的任何方法盹兢。
my_dog = Dog('willie', 6)
my_dog.sit()
my_dog.roll_over()
# 輸出:
Willie is now sitting.
Willie rolled over!
要調(diào)用方法,可指定實(shí)例的名稱(chēng)和要調(diào)用的方法守伸,并用句點(diǎn)分隔它們绎秒。
創(chuàng)建多個(gè)實(shí)例:
可按需求根據(jù)類(lèi)創(chuàng)建任意數(shù)量的實(shí)例。
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()
print("\nMy dog's name is " + your_dog.name.title() + ".")
print("My dog is " + str(your_dog.age) + " years old.")
your_dog.sit()
# 輸出:
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
My dog's name is Lucy.
My dog is 3 years old.
Lucy is now sitting.
可按需求根據(jù)一個(gè)類(lèi)創(chuàng)建任意數(shù)量的實(shí)例尼摹,條件是將每個(gè)實(shí)例都存儲(chǔ)在不同的變量中见芹,或占用列表或字典的不同位置。