第九章 面向?qū)ο?2
9.1類與對象
類是一個抽象的概念,就像上面我給你很多阿貓阿狗的圖片,問這是什么回答“動物”一樣,動物就是一個類的概念。世界上沒有動物這個東西,我們根據(jù)一些實際存在的阿貓阿狗,抽象出它們的共性得出了動物這個概念。而那些實際存在的一個一個看得到的阿貓阿狗就是一個個動物的具體實例,它們就對應(yīng)對象的概念。因此,一個個能夠區(qū)別的個體就是對象,也叫實例,而抽象的概念是類。試著想一個類似的例子吧,寫在下面:
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
Ok,為了幫助你更好的理解,我再提供一個例子,看看下面這些好吃的:

你看到的是一個個對象,什么對象呢?水果對象,世界上沒有哪一個東西是水果,因為如果我讓你拿一個水果來,你拿來的肯定是一個具體的梨、菠蘿、梅子、葡萄、椰子等等。我又想起中國邏輯學(xué)家公孫龍?zhí)岢龅囊粋€邏輯問題“白馬非馬”。
明白了類和對象的概念,我們來學(xué)習(xí)Python中如何定義一個類。定義類包含兩個部分,一個是屬性部分,一個是行為部分。定義類實際上就是描述一個類,抽象出這個類的屬性和行為,先來看一個例子。如果我們要定義一個Dog類,如何描述這個小狗呢?小狗有品種、顏色、年齡和名字這類的屬性,小狗能叫,能看家,還能啃骨頭,就這么多吧。我們?nèi)缦露x一個小狗類。
class Dog:
??? def __init__(self,type="Husky",color="white",age=1,name="panther"):
??????? self.type=type
??????? self.age=age
??????? self.color=color
??????? self.age=age
??????? self.name=name
?
??? def bark(self):
??????? print("bark ! bark !")
?
??? def eat(self):
??????? print("I can gnaw bone,yummy,yummy")
?
??? def protect(self):
??????? print("I can look after my house")
?
??? def information(self):
??????? print("My name is", self.name)
??????? print("I am",self.age,"years old!")
??????? print("I like", self.color)
??????? self.eat()
??????? self.protect()
??????? self.bark()
?
def main():
??? d=Dog(type="Husky",color="white",age=2)
??? d.information()
?
main()
?
運(yùn)行結(jié)果如下:
My name is panther
I am 2 years old!
I like white
I can gnaw bone,yummy,yummy
I can look after my house
bark ! bark !
回去好好看看源代碼,我們一句一句的解釋一下。
class Dog: #定義Dog類,語法為:class className:
每個類必須有一個初始化方法__init__,用于定義屬性(數(shù)據(jù)域)。類里面的每個方法都有一個self參數(shù),用于創(chuàng)建對象后指向創(chuàng)建的對象本身,其它的參數(shù)類似普通函數(shù)。在初始化方法__init__中,self.后面的如type、age之類的就是數(shù)據(jù)域,對應(yīng)于類的各種屬性,如品種、顏色、年齡和名字等。self.type=type的含義就是設(shè)置一個屬性type,用函數(shù)里面的參數(shù)type賦值,其它屬性類似。
??? def __init__(self,type="Husky",color="white",age=1,name="panther"):
??????? self.type=type
??????? self.color=color
??????? self.age=age
??????? self.name=name
bark為類里面的方法,這里僅實現(xiàn)功能打印“bark ! bark !”,其它方法類似。
??? def bark(self):
??????? print("bark ! bark !")
在類的內(nèi)部,每個方法都可以調(diào)用其它方法或者屬性,如下面information方法,可以訪問類的屬性self.name,也可以訪問類的方法self.eat()等。
??? def information(self):
??????? print("My name is", self.name)
??????? print("I am",self.age,"years old!")
??????? print("I like", self.color)
??????? self.eat()
??????? self.protect()
??????? self.bark()
?
定義好Dog類之后,我們要定義類的對象,在main方法中定義了一個Dog類的對象d=Dog(type="Husky",color="white",age=2),這行代碼創(chuàng)建對象后,會自動調(diào)用__init__初始化方法設(shè)置參數(shù)如type,color等。然后通過對象d調(diào)用類的方法information ,即d.information()實現(xiàn)輸出信息。
總結(jié)一下,定義類時要⑴指定類的名字,然后⑵定義初始化方法__init__和其它方法,在初始化方法中通過self加點運(yùn)算符⑶定義數(shù)據(jù)域,如self.name。然后定義main函數(shù),在main中⑷定義類的對象調(diào)用類的方法。好,試著自己定義一個貓類吧,這樣我們的阿貓阿狗就都全了。一步一步來吧。
⑴指定類的名字Cat,定義類: ????????????(你的答案寫在這兒)參考答案: class Cat:看不見。
⑵定義初始化方法__init__ 和diplay方法
??? def __init__(self):
??? def diplay(self): #類似Dog類中的Information顯示信息
⑶定義數(shù)據(jù)域self.age和self.name,把你的代碼寫在下面
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??????????????????def __init__(self, age=1,name="mimi"):
??????????????????????????????????????????? ????????????self.age=age
??????????????????????????????????????????? ????????????self.name=name
⑷定義類的對象調(diào)用類的方法,把你的代碼寫在下面
???????????????????????????????????????????? ???????????c=Cat()
???????????????????????????????????????????? ???????????c.display()
Ok, the end.
完整代碼如下:
class Cat:
??? def __init__(self,age=1,name="mi"):
??????? self.age=age
??????? self.name=name
??? def display(self):
??????? print("My name is", self.name)
??????? print("I am",self.age,"years old!")
?
def main():
??? d=Cat(age=2)
??? d.display()
?
main()
運(yùn)行結(jié)果:
My name is mi
I am 2 years old!
?
再試著定義個圓形類和三角形類,自己設(shè)計類的數(shù)據(jù)域和方法吧,這個沒有參考答案呦!
沒有,真的沒有!
定義好了類,就可以使用構(gòu)造方法由類來創(chuàng)建對象,構(gòu)造方法完成2個任務(wù):在內(nèi)存中為類創(chuàng)建一個對象;調(diào)用類的__init__方法來初始化對象。所有方法,包括初始化程序的方法,都有第一個參數(shù)self。self 指向調(diào)用方法的對象,__init__方法中的self參數(shù)被自動地設(shè)置為引用剛被創(chuàng)建的對象。
不提供一個參考答案怎么能知道自己做的有多差呢,我說的是我!
import math
?
class Circle:
??? # Construct a circle object
??? def __init__(self, radius=1):
??????? self.radius = radius
?
??? def getPerimeter(self):
??????? return 2 * self.radius * math.pi
?
??? def getArea(self):
??????? return self.radius * self.radius * math.pi
?
??? def setRadius(self, radius):
??????? self.radius = radius
?
class Triangle:
??? # Construct a triangle object
??? def __init__(self, s1=1, s2=1, s3=1):
??????? self.side1 = s1
??????? self.side2 = s2
??????? self.side3 = s3
?
??? def getPerimeter(self):
??????? return self.side1+self.side2+self.side3
?
??? def getArea(self):
??????? #海倫公式
??????? p=self.getPerimeter()/2
??????? s=math.sqrt(p*(p-self.side1)*(p-self.side2)*(p-self.side3))
??????? return s
??
def main():
??? c=Circle(2)
??? t=Triangle(3,4,5)
??? print("圓的周長和面積為:",format(c.getPerimeter(),".2f"),format(c.getArea(),".2f"))
??? print("三角形的周長和面積為:",t.getPerimeter(),t.getArea())
?
main()