日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python----面对对象三大特征2

發布時間:2023/12/18 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。