python----面对对象三大特征2
多態
什么是多態?多態指的是一類事物有多種形態,例如一個動物類,狗和貓都通過繼承動物類來得來,這樣我們可以將狗、貓稱作動物類的另一種形態。
在java中也存在多態,java中的多態是用來解決在一個函數中如果接受2個以上類型的參數,那么這些類型都應該繼承同一個類,這個類是所有子類的對象的類型,在java中函數是需要指定傳入的類型的,如果傳入的參數類型不對應則就會報錯:
那么java中是如何解決這個問題的呢,就是用了多態:class Payment: #父類,支付類
passclass Apay(Payment): #子類,蘋果支付def pay(self):passclass Alipay(Payment): #子類,阿里支付def pay(self):pass apay = Apay()alipay = Alipay()
def pay(obj): obj.pay
pay(apay) #傳入apay類
pay(alipay) #傳入alipay類
可以看出pay()接受了2個類型的參數,如果在java中是會報錯的,那么如何解決這個問題呢。我們可以把pay()接受的參數類型定位payment類,然后所有的傳入的參數都是此類的子類,這樣參數類型就同一了。
而在python中大家發現我們在傳參數時并沒有類型限制,這是為什么呢,大家知道python3中?全都是新式類,而新式類都自動繼承了一個object一個類。所以:
在python中:函數的參數不需要指定數據類型,所以我們也不需要通過繼承的形式來統一一組類的類型,
換句話說 所有的對象其實都是object類型,所以在python當中其實處處是多態。
鴨子類型:
Python崇尚鴨子類型,即‘如果看起來像、叫聲像而且走起路來像鴨子,那么它就是鴨子’
python程序員通常根據這種行為來編寫程序。例如,如果想編寫現有對象的自定義版本,可以繼承該對象
也可以創建一個外觀和行為像,但與它無任何關系的全新對象,后者通常用于保存程序組件的松耦合度。
利用標準庫中定義的各種‘與文件類似’的對象,盡管這些對象的工作方式像文件,但他們沒有繼承內置文件對象的
封裝:
什么是封裝,封裝就是將對象的某些屬性和方法隱藏起來,只能在自己的內部調用,對外只能提供公共的訪問方式。
【好處】?
1. 將變化隔離;?
2. 便于使用;
3. 提高復用性;?
4. 提高安全性;
【封裝原則】
????? 1. 將不需要對外提供的內容都隱藏起來;
????? 2. 把屬性都隱藏,提供公共方法對其訪問。
廣義上的封裝:
class 類名:def 方法1(self):pass# 是為了只有這個類的對象才能使用定義在類中的方法
狹義的封裝:
在python中用雙下劃線開頭的方式將屬性隱藏起來(設置成私有的)
私有變量(屬性)
class Goods:__discount = 0print(__discount)print(Goods.__discount) #報錯提示AttributeError: type object 'Goods' has no attribute '__discount' print(Goods.__dict__)#運行結果:{'__module__': '__main__', '_Goods__discount': 0, '__dict__': <attribute '__dict__' of 'Goods' objects>, '__weakref__': <attribute '__weakref__' of 'Goods' objects>, '__doc__': None}
可以看出在打印Goods屬性的時候可以看到_Goods__discount': 0,而不是__discount,這是因為當定義一個--變量名時,python會將做一個變形變成_類名__變量的模式,這樣對象.__變量名就找不到屬性了,而在類內部__變量名還是可以找到,這也是print(__discount)運行的原因,因為在類中調用時會自定轉化成_類名__變量。
總結:
1.類中定義的__x只能在內部使用,如self.__x,引用的就是變形的結果。
2.這種變形其實正是針對外部的變形,在外部是無法通過__x這個名字訪問到的。
3.在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。
私有方法:
既然能將屬性私有,當然也可將類的方法私有,跟私有屬性一樣,就是在方法前面加__:
class Goods:__discount = 0.7def __init__(self,name,price):self.name = nameself.price = pricedef __set_discount(self,num):self.__discount = num上面這個例子是一個商品類,有兩個屬性,一個名稱還有個價格,是私用屬性,外部訪問不到,然后還有個私用方法,所以一般別人不知道根本修改不了折扣,也不知道商品的價格
# 類中的私有成員:# 私有的靜態屬性# 私有的對象屬性# 私有的方法# 我為什么要定義一個私有變量呢:# 我不想讓你看到這個值# 我不想讓你修改這個值# 我想讓你在修改這個值得時候有一些限制# 有些方法或者屬性不希望被子類繼承# 私有變量能不能在外部被定義??? # class A : # __country = 'China' # 在類的內部會發生變形 # print(__country) # '_A__country' # print(A.__dict__) # A.__Language = 'Chinese' # print(A.__dict__)# 私有變量能不能被繼承??? # class A: # __country = 'China' # def __init__(self,name): # self.__name = name # '_A__name' # # class B(A): # # print(__country) # # NameError: name '_B__country' is not defined # def get_name(self): # return self.__name # '_B__name' # # b = B('alex') # print(b.__dict__)# 廣義上的封裝 把屬性函數都放到類里 # 狹義上的封裝 定義私有成員# 類中的私有成員:# 私有的靜態屬性# 私有的對象屬性# 私有的方法# 我為什么要定義一個私有變量呢:# 我不想讓你看到這個值# 我不想讓你修改這個值# 我想讓你在修改這個值得時候有一些限制 : 保證了數據的安全# 有些方法或者屬性不希望被子類繼承?
轉載于:https://www.cnblogs.com/Kingfan1993/p/9554811.html
總結
以上是生活随笔為你收集整理的python----面对对象三大特征2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现串口通信的小样例
- 下一篇: websocket python爬虫_p