物件導向程式設計,是大多數高階語言都具有的程式設計思想,python 也不例外。物件導向主要體現為以下三點特性:
在python語言中,物件導向最重要的兩個概念為 類(class)和例項(instance).
定義類的關鍵字為class,這與大多數程式語言類似,class後接類名,類名後緊接著父類名稱,如果沒有繼承類,則使用object類。定義類如下:
class
classname
(object):
建立例項是通過類名實現的,例如:
class1=classname() #變數class1 指向了乙個classname的例項
封裝
在python 類定義中,也可以使用「建構函式」功能,通過定義乙個特殊的 _ init _方法,第乙個引數永遠是 self,表示建立的例項本身。
有了_ init _方法,建立實重點內容例的時候,必須傳入引數。例如:
class
a(object):
def__init__(self,name):
self.name=name
stu=a('hello')
stu.name # 輸出為 hello
訪問限制,python語言中,如果需要對類中的變數進行作用域限定,即限定內部屬性不被外部訪問,可以在屬性的名稱前加兩個下滑線__
。一旦在類中的變數名前加入__
,則宣告了變數為類的私有變數,只能在內部進行訪問,不能外部訪問。
例如:
class
a(object):
def__init__(self,name):
self.__name=name
defprinta(self):
print(self.__name)
stu=a('zxg')
print(stu.__name) #會報錯,錯誤型別attributeerror: 'a' object has no attribute '__name'
通過這種方式,就有效地保護了類物件內部的屬性安全,如果需要獲取類的私有變數的值,或者外部改變內部成員變數,只需要在類內部,增加如下的方法即可,
class
a(object):
def__init__(self,name):
self.__name=name
defprinta(self):
print(self.__name)
defget_name(self):
return
self.__name
defset_name(self,name):
self.__name=name
stu=a('zxg')
a_name=stu.get_name() #變數a_name 儲存了self.__name的值
stu.set_name('a') #變數self.__name值已經更新為 『a』
雖然使用__
變數,無法直接從外部訪問變數,但是這是python直譯器將變數重名的原因,拿上面的例子而言,python直譯器將__name
對外顯示為_a__name
,所以使用stu.__name
獲取變數值,但是如果使用stu._a__name
,則有可能獲取內部變數的值,為什麼這裡使用有可能?因為不同的python直譯器,對類內部變數的重新命名規則不同,因此,強烈建議不要這樣訪問內部變數。
繼承
物件導向程式設計,繼承使用廣泛,簡單地說,當我們定義乙個類,如果這個類需要繼承某個現有的類,則把新產生的類稱為子類,被繼承的類稱為父類或者基類。
舉個例:
class
student(object): #基類
defp_info(self):
print('i am student!')
class
mid_student(student): #初中學生子類,繼承student
pass
class
high_student(student):#高中學生子類,繼承student
pass
子類可以繼承父類的全部功能,使用如下:
a=mid_student()
a.p_info() # 輸出 i am student!
b=high_student()
b.p_info() #輸出 i am student!
當然,也可在子類中繼續增加方法,
class
mid_student
(student):
defp_info
(self):
print('i am mid_student!') #函式名與父類函式名一致,因此呼叫時,會覆蓋父類函式
defp_act
(self):
print ('more homework!!!')
呼叫後,結果如下:
a=mid_student()
a.p_info() # 輸出 i am mid_student!
a.p_act() #輸出 more homework!!!
如上,當子類的函式覆蓋父類的函式時,**執行時,總是會呼叫子類的函式功能,這樣,就體現了 物件導向程式設計的另一特性:多型。
多型
子類繼承父類 ,任何依賴父類作為引數的函式都可以不加修改地正常執行, 執行時由該物件的確切型別決定。
class
student
(object):
defp_info
(self):
print('i am student!!')
class
mid_student
(student):
defp_info
(self):
print('i am mid_student!')
defp_act
(self):
print ('more homework!!!')
defp_info_twice
(student):
# 引數為父類
student.p_info()
student.p_info()
class
high_student
(student):
#高中學生子類,繼承student
#def p_info(self):
# print('i am high_student!')
defpp
(mid_student):
mid_student.p_info()
a=mid_student()
a.p_info_twice() #自動呼叫 mid_student型別的p_info方法
#輸出 i am mid_student!
i am mid_student!
b=high_student()
b.pp()
#輸出 i am student!!
# high_student繼承的是student不是mid_student,因此 pp方法的mid_student型別,會逐一向上尋找,找到父類student的p_info方法
python小菜的學習之路之python初識
筆者介紹 本文python初學者,因為名字內帶xiong,因此自嘲 熊小菜 熊小菜因為在解決課題問題時,接觸到過多的python,這對於乙個c 程式設計師而言是鬱悶的,此處,引用一句名言 既然你改變不了環境,那就學會適應它 因此,熊小菜開始進行python的學習,希望終有一天從熊小菜轉變成熊小神。話...
小菜鳥學習Python之路 filter(素數)
設計思路 素數 大於1的自然數,最小的素數是2。約數只有1和自身的自然數為素數 大於2的偶數都不是素數 step1 生成乙個以3為首的奇數序列 generator def odd iter n 1 while true n n 2 yield n這是乙個無限序列 step 2 定義乙個篩選函式 de...
Python學習之物件導向
物件導向是一種設計思想 1 符合人們的思考習慣 2 把執行者變成指揮者 3 簡化功能,把複雜的事情簡單化 想完成一件事,找具有這樣功能的物件 如果能找到,呼叫這個物件的功能,完成這個事 如果找不到,建立具有這樣功能的物件,再呼叫完成這個事 類是對事物的描述,是抽象的。物件是類的具體體現。類對事物的描...