本篇文章帶給大家的內容是關於Python語言的物件導向程式設計的介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
Python語言的物件導向
#物件導向編程,即OOP,對於物件導向的語言來說,常常會提到封裝、繼承、類別等概念。
物件導向的由來:基於哲學中的萬物皆對象,核心思想是將我們的程式物件化,模組化,在Python語言中常用class命名一個類,例如class Person(),class Student等等。在類別中常有屬性和行為,例如在Person這個類別中有名字,身高,體重等屬性,這些Python有吃,睡,交朋友等行為。透過類別我們可以很方便的實現後期的調用,而不需要將一些重複的程式碼再寫一遍,這大大提高了程式設計的效率。所以目前物件導向的程式語言應用廣泛。
物件導向有三大特徵繼承,封裝,多型
1 繼承
繼承概念:一個類別繼承另一個類,則稱繼承的類別為子類,被繼承的類別為父類。
目的:能夠實現程式碼的重複使用。
理解:子類與父類的關係不是日常生活中的父子關係,子類與父類而是一種特殊化與一般化的關係,是is-a的關係,子類是父類更加詳細的分類。如class dog 繼承於animal,就可以理解為dog is a animal.注意設計繼承的時候.
結果:繼承後子類自動擁有了父類的屬性和方法,子類可以寫自己特有的屬性和方法,目的是實作功能的擴展,子類別也可以複寫父類別的方法即方法的重寫。
2 封裝
概念:封裝也稱為資訊隱藏,是指利用抽象資料類型將資料和基於資料的操作封裝在一起,使其構成一個不可分割的獨立實體,資料被保護在抽象資料類型的內部,盡可能隱藏內部的細節,只
保留一些對外介面使之與外部發生聯繫。系統的其他部分只有透過包裹在資料外面的被授權的操作來與這個抽象資料類型交流與互動。也就是說,使用者無需知道物件內部方法的實作細節,但可以根據物件提供的外部介面(物件名稱和參數)存取該物件。
好處:(1)明確分工。將能實現某一特定功能的程式碼封裝成一個獨立的實體後,各程式設計師可以在需要的時候調用,從而實現了專業的分工。 (2)訊息隱蔽,實現細節。透過控制存取權限可以將可以將不想讓客戶端程式設計師看到的資訊隱藏起來,如某客戶的銀行的密碼需要保密,只能對該客戶開發權限。
3 多態
概念:相同的事物,呼叫其相同的方法,參數也相同時,但表現的行為卻不同。
理解:子類別以父類別的身份出現,但做事情時還是以自己的方法實作。子類別以父類別的身份出現需要向上轉型(upcast),其中向上轉型是由JVM自動實現的, 是安全的,但向下轉型(downcast)是不安全的,需要強制轉換。子類別以父類別的身份出現時自己特有的屬性和方法將不能使用。
「過程導向」和「物件導向」的差異
面對過程就是分析出解決問題所需的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依序呼叫就可以了;物件導向是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
可以拿生活中的實例來理解過程導向與物件導向,例如完成一場比賽,過程導向的設計想法就是先分析問題的步驟:
1、比賽開始2、開始競爭,3、中途超越,4、分出勝負。把上面每個步驟用不同的方法來實現。
如果是物件導向的設計思想來解決問題。物件導向的設計則是從另外的思路來 解決問題。整個比賽可分為1、比賽對象 2、比賽規則3、結果評定等。
下面以一個小例子來說明Python語言物件導向的程式設計過程:
一、 #1 定义一个类,其中类名是学生 #2 学生具有的属性 #3 学生具有哪些行为 #4 具体化两个学生,实例化类型 class Student(object): name = " " age = 12 weight = 50 school = "wuhan university" def eat(self,orange): print("l love orange") def study(self): print("let me study!") stu1 = Student() stu2 = Student() print(stu1) print(stu2) print(stu1.name) print(stu1.age) print(stu2.name) print(stu2.age) 二、 #进一步优化:通过上面的程序我们发现他们最终输出的对象的属性一样,但是事实上他们是两个不同的学生,他们的名字,年龄并不相同,那么接下来需要做的就是给他们各自赋予各自的属性,利用类名.属性=某个值,和方法的调用一样也是类名.方法名 class Student(object): name = " " age = 12 weight = 50 school = "wuhan university" def eat(self,orange): print("l love orange") def study(self): print("let me study!") stu1 = Student() stu1.name="王" stu1.age = 20 stu2 = Student() stu2.name = "张" stu2.age = 50 print(stu1) print(stu1.name) print(stu1.age) print(stu2) print(stu2.name) 三、 #进一步优化:通过第二个程序我们发现在定义对象的属性时我们还需要将所得属性命名在写一次,这样显然比价麻烦,于是有了更好的属性命名方法,我们可以使用初始化 def __init__(self,、、、),最后在命名属性的时候只需要在类名后面的括号中填写具体的属性值即可,大大较少了代码量。 class Student(object): def __init__(self,name,age,school): self.name = name self.age = age self.school = school def eat(self,orange): print("l love orange") def study(self): print("let me study!") stu1 = Student("li",25,"scu") stu2 = Student("sun",20,"wpu") print(stu1) print(stu2) print(stu1.name) print(stu1.school) print(stu2.name) print(stu2.school)
self 代表類別中的實例,而不是類,那個實例呼叫類別中的方法,那麼這個self就屬於那個對象,例如在Student中加一個方法,自我介紹。
class Student(object): def __init__(self,name,age,school): self.name = name self.age = age self.school = school def eat(self,orange): print("l love orange") def study(self): print("let me study!") def intro(self): print("my name is{},{} years old".format(self.name,self.age)) stu1 = Student("li",25,"scu") stu2 = Student("sun",20,"wpu") print(stu1) print(stu2) print(stu1.name) print(stu1.school) print(stu2.name) print(stu2.school) intro1 = stu1.intro() intro2 = stu2.intro()
若要列印出物件的屬性等資訊給客戶看,但是由於屬性太多,一個個列印出來很麻煩,可以使用__str__(),如下:
class Student(object): def __init__(self,name,age,school): self.name = name self.age = age self.school = school def eat(self,orange): print("l love orange") def study(self): print("let me study!") def intro(self): print("my name is{},{} years old".format(self.name,self.age)) def __str__(self): return "%s-%d"%(self.name,self.age) stu1 = Student("li",25,"scu") stu2 = Student("sun",20,"wpu") print(stu1)
如果要是的Python中类的属性值不改变,那么在属性前加两个-,称为私有属性,private
如:
self.__money = money,不能再外面直接访问
print(stu1.__money)报错
但是在内部可以直接使用,如在方法eat中调用
如果属性名前是一个下划线,则他虽然可以在外部访问,但是约定俗成提示不要访问!!!
以上是Python語言的物件導向程式設計的介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!