python學習之面向對象知識介紹

ADVERTISEMENT

python學習之面向對象知識介紹

前言

最近在學習Python的面向對象編程,以前是沒有接觸過其它的面向對象編程的語言,因此學習這一部分是相當帶勁的,這里也總結一下。

概述

  • python支持多種編程範式:面向過程、面向對象、面向切面(裝飾器部分)等。
  • 面向過程:根據業務邏輯從上到下寫壘代碼
  • 函數式:將某功能代碼封裝到函數中,日後便無需重複編寫,僅調用函數即可
  • 面向對象:對函數進行分類和封裝,讓開發“更快更好更強...”

OOP思想

  • 面向對象的基本哲學:世界由具有各自運動規律和內部狀態的對象組成,對象之間相互作用和通訊構成了世界。
  • 唯一性,世界沒有兩片相同的樹葉,同樣的沒有相同的對象。
  • 分類性,分類是對現實世界的抽象。
  • 三大特性:封裝、繼承和多態

面向對象的三大特性:

一、封裝

封裝,對具體對象的一種抽象,即將某些部分隱藏起來,在程序外部看不到,即無法調用。

私有化:將類或函數中的某些屬性限制在某個區域之內,外部無法調用。

Python中私有化的方法也比較簡單,就是在準備私有化的屬性(包括方法、數據)名字前面加雙下劃線。

例如:


 class ProtectMe(object): 
 def __init__(self):
 self.me = "qiwsir"
 self.__name = "kivi"
 
 def __python(self):
 print("I love Python.") 
 
 def code(self):
 print9"Which language do you like?")
 self.__python()
 
 if __name__ == "__main__":
 p = ProtectMe()
 print(p.me)
 print(p.__name)
 
 #運行結果
 qiwsir
 Traceback (most recent call last):
 File "21102.py", line 21, in 
 print p.__name
 AttributeError: 'ProtectMe' object has no attribute '__name'
ADVERTISEMENT

說明:__name屬性隱藏了,無法調用。

調用私有屬性,可以使用property函數


 class ProtectMe(object): 
 def __init__(self):
 self.me = "qiwsir"
 self.__name = "kivi"
 
 @property
 def name(self):
 return self.__name
 
 if __name__ == "__main__":
 p = ProtectMe()
 print(p.name)
 
 #運行結果
 kivi 

所以,在使用面向對象的封裝特性時,需要:

  • 將內容封裝到某處
  • 從某處調用被封裝的內容

第一步:將內容封裝到某處

self 是一個形式參數,當執行 obj1 = Foo('wupeiqi', 18 ) 時,self 等於 obj1

當執行 obj2 = Foo('alex', 78 ) 時,self 等於 obj2

所以,內容其實被封裝到了對象 obj1 和 obj2 中,每個對象中都有 name 和 age 屬性,在內存里類似於下圖來保存。

第二步:從某處調用被封裝的內容

調用被封裝的內容時,有兩種情況:

  • 通過對象直接調用
  • 通過self間接調用

 class Role(object):
 ac = None #類變量
 def __init__(self,name,role,weapon,life_value):
 #初始化方法
 self.name = name #實例變量(成員變量)
 self.role = role
 self.weapon = weapon
 self.life_val = life_value
 
 def buy_weapon(self,weapon): #定義方法
 #self:表示實例本身
 self.weapon = weapon
 # print("%s is buying [%s]" %(self.name,weapon))
 
 #把一個抽象的類變成一個具體的對象的過程,叫實例化
 
 p1 = Role("sanjiang",'Police',"B10",90) #實例
 t1 = Role("Chunyun",'Terrorist',"B11",100)

二、繼承

繼承,面向對象中的繼承和現實生活中的繼承相同,即:子可以繼承父的內容。


 class SchoolMember(object):
 # member_nums = 0
 def __init__(self,name,age,sex):
 self.name = name
 self.age = age
 self.sex = sex
 # self.enroll()
 
 def enroll(self):
 SchoolMember.member_nums += 1
 print("SchoolMember [%s] is enrolled!" %self.name)
 
 def tell(self):
 print("Hello my name is [%s]" %self.name)
 
 class Teacher(SchoolMember):
 def __init__(self,name,age,sex,course,salary): #重寫父類的__init__方法
 super(Teacher,self).__init__(name,age,sex) #繼承(新式類)
 # SchoolMember.__init__(self,name,age,sex) #繼承(舊式類)
 self.course = course
 self.salary = salary
 
 def teaching(self):
 print("Teacher [%s] is teaching [%s]" %(self.name,self.course))
 
 
 
 class Student(SchoolMember):
 def __init__(self,name,age,sex,course,tuition):
 super(Student,self).__init__(name,age,sex)
 self.course = course
 self.tuition = tuition
 
 def pay_tuition(self):
 print("ca,student [%s] paying tuition [%s] again" %(self.name,self.tuition))

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

ADVERTISEMENT

本文地址:
ADVERTISEMENT
ADVERTISEMENT