面向對象特征:封裝、多態 以及 @propetry裝飾器

(繼承補充)組合
?obj=fun()#對象
?obj.attr=foo()#對象的屬性等于另一個對象
?什么是組合:?
??  A類的對象具備某一個屬性,該屬性的值是B類的對象
?  ?基于這種方式就把A類與B類組合到一起
??  對象既能使用A類中的數據與功能,也能使用B類中的數據與功能
?為什么要用組合:
??   組合與繼承的作用一樣,都是用來減少類與類之間的重復代碼
?#組合不屬于繼承
?#類使用將變量及處理其的函數捆綁起來
?#繼承是強耦合,組合是解耦合
?如何用組合:
??class People:
???  def __init__(self,name,age):
????    self.name=name
????    self.age=age
????    self.eat=[]
???  def tell_eat(self):
???    ?for i in self.eat:
????      ?i.tell_info()
?????
??class Eat:
??  ?def __init__(self,e_name,e_price):
????    self.e_name=e_name
????    self.e_price=e_price
???  def tell_info(self):
????    print('食物%s 價格%s'%(self.e_name,self.e_price))
p=People('張三',18)
??eat1=Eat('肯德雞',38)
??eat2=Eat('烤乳豬',120)
??p.eat.append(eat)
??
?多態與多態性
??????? 什么是多態:
?????   同一種事物有多種形態在程序中用繼承可以表現出多態
??????? 多態性:
?????   在多態的背景下,可以在不用考慮對象具體類型的前提下而直接使用對象
?????   多態性的精髓:統一
??import abc
??class Animal(metaclass=abc.ABCMeta):#強制子類使用這套標準中加@..的名字,子類沒有報錯
??  ?@abc.abstractmethod?? #被強制的名字
??  ?def speak(self):
???    ?pass
????
???  def run(self):
???    ?pass
??# Animal() # 父類只是用來建立規范的,不能用來實例化的,更無需實現內部的方法
class People(Animal):
??  ?def speak(self):
????    print('say hello')
class Dog(Animal):
???  def speak(self):
????    print('汪汪汪')
???  def run(self):
???    ?pass
???????????
??????? python推崇鴨子類型:(像什么,就有什么的特征)
??????????? class Txt:
??????????????? def read(self):
??????????????????? pass
??????????? class Disk:
??????????????? def read(self):
??????????????????? pass
?????
#BMI=體重(kg)÷身高^2(m)
#首先需要明確。bmi是算出來的,不是一個固定死的值,很明顯人的bmi值聽起來更像一個名詞而非動詞,于是我們需要為bmi這個函數添加裝飾器將其偽裝成一個數據屬性
# @property裝飾器是用來將類內的函數屬性偽裝成數據屬性
#@property裝飾的函數可以調setter及deleter
# class People:
#???? def __init__(self,name):
#???????? self.__name=name
#
#???? @property
#???? def name(self):
#???????? return '<名字:%s>' %self.__name
#
#???? @name.setter
#???? def name(self,obj):
#???????? if type(obj) is not str:
#???????????? print('name必須為str類型')
#???????????? return
#???????? self.__name=obj
#
#???? @name.deleter
#???? def name(self):
#???????? # print('不讓刪')
#???????? del self.__name
#
# obj=People('egon')
#
# # print(obj.name)
# # obj.name='EGON'
# # obj.name=123
# # print(obj.name)
#
# del obj.name
# print(obj.__dict__)

封裝
?self.__name=name #_類名__name 定義階段轉形
?什么是封裝
??   裝:往容器/名稱空間里存入名字
??   封:代表將存放于名稱空間中的名字給藏起來,這種隱藏對外不對內
補充說明:封裝絕對不是單純意義的隱藏
??  需知定義屬性的目的就是為了讓使用者去用,使用者要想使用類內部隱藏的屬性
??  需要類的設計者在類內部開一個接口(定義一個方法),在該方法內訪問隱藏的屬性
?  ?,使用者以后就通過該方法來“間接地”訪問內部隱藏的屬性
??  作為類的設計者可以在接口之上附加任意邏輯從而嚴格控制類的使用者對屬性的操作
?如何封裝?
??????? 1. __開頭的屬性實現的隱藏僅僅只是一種語法意義上的變形,并不會真的限制類外部的訪問
??????? 2. 該變形操作只在類定義階段檢測語法時發生一次,類定義階段之后新增的__開頭的屬性并不會變形
??????? 3. 如果父類不想讓子類覆蓋自己的屬性,可以在屬性前加__開頭
?封裝形式?
??封裝數據屬性:把數據屬性封裝起來,然后需要開辟接口給類外部的使用者使用,好處是我們可以在接口之上添加控制邏輯,從而嚴格空間訪問者對屬性的操作
??class People:
??????????????? def __init__(self,name):
??????????????????? self.__name=name
def tell_name(self):
??????????????????? # 添加邏輯
??????????????????? return self.__name
?????
??封裝函數屬性:隔離復雜度
??????????? class ATM:
??????????????? def __card(self):
??????????????????? print('插卡')
??????????????? def __auth(self):
??????????????????? print('用戶認證')
??????????????? def __input(self):
??????????????????? print('輸入取款金額')
??????????????? def __print_bill(self):
??????????????????? print('打印賬單')
??????????????? def __take_money(self):
??????????????????? print('取款')
def withdraw(self):
??????????????????? self.__card()
??????????????????? self.__auth()
??????????????????? self.__input()
??????????????????? self.__print_bill()
??????????????????? self.__take_money()
??封裝的終極奧義:明確地區分內外,對外是隱藏的,對內是開放的

轉載于:https://www.cnblogs.com/3sss-ss-s/p/9511760.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250875.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

15 錯誤邊界與使用技巧

錯誤邊界 React16增加防止某個組件的UI渲染錯誤導致整個應用崩潰子組件發生JS錯誤&#xff0c;有備用的渲染UI錯誤邊界是組件&#xff0c;只能用class組件來寫 錯誤邊界組件捕獲錯誤的時機 渲染時生命周期函數中組件樹的構造函數中 getDerivedStateFromError 生命周期函數…

深入探究Spark -- Cluster Manger部署(最常用為YARN實現Task Scheduler)

部署方式有&#xff1a;Standalone&#xff08;Spark的Deploy模塊&#xff09;、Mesos、YARN、EC2、LocalSparkContext創建時&#xff0c;通過傳入的Master URL不同&#xff0c;創建不同的SchedulerBackend和TaskScheduler&#xff0c;在spark.SparkContext#createTaskSchuster…

es6 --- Promise.all等待多個異步任務執行

項目中遇到一個問題,要用多個http請求,獲取數據,然后將獲取的數據統一處理… 第一反應想到用promise.all來做… 下面進入主體 // 首先使用promise封裝http請求. function getListByDetecttype (params) {return new Promise((resolve, reject) > {let param params ? par…

16 代碼分割之錯誤邊界與Suspense和命名導出

代碼分割之錯誤邊界與Suspense const Main React.lazy(() > import(./main)) class ErrorBoundary extends React.Component {state {hasError: false,}static getDerivedStateFromError(err) {console.log(getDerivedStateFromError err, err)return {hasError: true}}c…

Python 原生爬蟲

Python3 實現游戲主播人氣排行榜 from urllib import request import re# 爬取某個游戲主播的人氣&#xff08;每個游戲主播的觀看人數&#xff09;排行榜 爬蟲前奏&#xff1a;明確爬蟲目的找到數據對應的網頁分析網頁的結構找到數據所在的標簽位置模擬HTTP請求&#xff0c;向…

Mac 下查看網絡端口占用情況

1、Mac 下查看網絡端口占用情況 有的時候關閉了服務器&#xff0c;但是端口還是占用&#xff0c;解決的方法是 kill 掉占用該端口的進程。 # 查看 8009 端口的占用情況 $ lsof -i:8009 可以看到&#xff0c;該端口被 id 為 4215 的進程所占用&#xff0c;這個時候直接在命令…

javascript --- 變量提升的理解

看下面一段代碼: (function () {var x foo();var foo function foo () {return "foobar";};return x; })();(不許打出來)猜猜返回結果是什么… 答案是 // foo is not a function下面來解釋為什么會這樣,首先得明白: 1.如果變量聲明了但未賦值,則會顯示undefined…

17 初探Context的使用場景

context 容器&#xff08;即上下文&#xff09; → 裝數據 → 可以傳遞到程序的多個地方程序在執行時可訪問的容器 import styles from ...則css要寫module.css&#xff0c;否則無效果&#xff1b; import from ...則css無須寫module. &#xff0c;否則無效果 使用 context.j…

分布式監控系統開發【day37】:需求討論(一)

本節內容 為什么要做監控&#xff1f; 常用監控系統設計討論監控需求討論如何實現監控服務器的水平擴展&#xff1f;監控系統架構設計一、為什么要做監控&#xff1f; 熟悉IT監控系統的設計原理開發一個簡版的類Zabbix監控系統掌握自動化開發項目的程序設計思路及架構解藕原則…

iOS:練習題中如何用技術去實現一個連線題

一、介紹 本人做的app涉及的是教育行業&#xff0c;所以關于練習題的開發肯定是家常便飯。例如&#xff0c;選擇題、填空題、連線題、判斷題等&#xff0c;每一種題型都需要技術去實現&#xff0c;沒啥多大難度&#xff0c;這里呢&#xff0c;就給出實現連線題的核心代碼吧。過…

18 Context與組合的應用場景與使用問題

contextType 指定context類型為創建的上下文&#xff0c;此時不需要用Consumer組件包裹&#xff0c;使用this.context即可訪問會向上找最近的上下文并取值最適合的場景&#xff1a;雜亂無章的組件都需要同一些數據&#xff1b;若單純為了不層層傳遞屬性&#xff0c;使用contex…

http --- 共享加密(對稱加密)的幾個概念

使用互聯網進行數據傳輸時,可能會產生以下四個問題: 1. 竊聽: A向B發送的消息,有可能在傳輸過程中被X竊聽到 2. 假冒: A收到來自B的消息有可能是X冒充的 3. 篡改: A確實收到來自B的消息,但是該消息有可能被X篡改了 4. 事后否認:B確實收到了來自A的消息,但是A是惡意用戶,當A像B…

213. House Robber II 首尾相同的偷竊問題

&#xff3b;抄題&#xff3d;&#xff1a; You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of…

原型鏈

<!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title></title></head><body><script> /* 原型中的默認屬性 原型鏈&#xff1a;當調用構造函數&#xff08;Fn()&a…

http --- 公開密鑰加密(非對稱加密)的幾個概念

公開密鑰加密: 公鑰加密,私鑰解密 公開密鑰加密的處理流程: 1. A準備通過互聯網向B發送數據 2. B生成公鑰P和私鑰S 3. B將P發送給A 4. A使用P進行加密,并將密文通過互聯網發送給B 5. B使用S進行解密得到數據公鑰加密的更具體的栗子: 1.B首先準備好公鑰P和私鑰S 2.B將公鑰發布…

19、20 Context API

安裝React Dev Tool Context對象.displayName 使用別名 不使用別名 React.createContext 創建指定的Context對象組件會找離自己最近的Provider&#xff0c;獲取其value變量名都叫value的情況&#xff0c;就近取AContext變量名有所區分&#xff0c;兩個value都可以獲取可以…

01-spring配置詳解

1 bean元素 <!--將User對象交給spring容器進行管理 --><!-- Bean元素:使用該元素描述需要spring容器管理的對象class屬性:被管理對象的完整類名.name屬性:給被管理的對象起個名字.獲得對象時根據該名稱獲得對象. 可以重復.可以使用特殊字符.id屬性: 與name屬性一模一…

第八模塊:算法設計模式、企業應用 第2章 企業應用工具學習

第八模塊&#xff1a;算法&設計模式、企業應用 第2章 企業應用工具學習轉載于:https://www.cnblogs.com/tqtl911/p/9131614.html

http --- 混合加密的具體過程

混合加密: 共享加密存在一個“共享密鑰”無法安全告知服務端的問題.公開加密存在,加密、解密速度慢的問題.混合加密則同時使用了2種加密技術,具體過程如下: 1. B提前生成公鑰P和私鑰S,并將P發布到網上 2. A想(通過互聯網)像B發送數據 3. A從互聯網上獲取B的公鑰P,并使用P對共享…

Vite+Vue3頁面空白、圖標不顯示問題解決

頁面空白問題 由于項目部署在子文件夾下&#xff0c;因此需要配置vite.config.js const config {base: ./, }el-icon圖標不顯示、打包時mkdir無權限 在控制臺Network看字體圖標的請求&#xff0c;發現地址多了_assets&#xff0c;本以為需要重新配置publicDir&#xff0c;后…