Python學習(七)面向對象 ——封裝

Python?類的封裝

?

  承接上一節,學了Student類的定義及實例化,每個實例都擁有各自的name和score。現在若需要打印一個學生的成績,可定義函數 print_score()

  該函數為類外的函數,如下:

 1 class Student(object):
 2     def __init__(self, name, score):
 3         self.name = name
 4         self.score = score
 5 
 6 May = Student("May",90)                      # 須要提供兩個屬性
 7 Peter = Student("Peter",85)
 8 print(May.name, May.score)
 9 print(Peter.name, Peter.score)
10 
11 def print_score(Student):                    # 外部函數print_score(Student)
12     # print("%s's score is: %d" %(Student.name,Student.score))             # 普通 print 寫法
13     print("{0}'s score is: {1}".format(Student.name,Student.score))        # 建議使用 Python 2.7 + .format優化寫法
14 print_score(May)    
15 print_score(Peter)

?

  既然Student實例本身就擁有這些數據,要訪問這些數據,就沒有必要從外面的函數去訪問,我們可以直接在Student類的內部定義訪問數據的函數。這樣,就把數據給“封裝”起來了。

  “封裝”就是將抽象得到的數據和行為(或功能)相結合,形成一個有機的整體(即類);封裝的目的是增強安全性和簡化編程,使用者不必了解具體的實現細節,而只是要通過外部接口,一特定的訪問權限來使用類的成員。

  而這些封裝數據的函數是和Student類本身是關聯起來的,我們稱之為類的方法。那如何定義類的方法呢?

  就要用到對象 self?本身,參考上例,把 print_score()?函數寫為類的方法(Python2.7之后的版本,推薦.format?輸出寫法):

 1 class Student(object):
 2     def __init__(self, name, score): 
 3         self.name = name
 4         self.score = score
 5 
 6     def print_score(self):
 7         print("{self.name}'s score is: {self.score}".format(self=self))        # Python 2.7 + .format優化寫法
 8         
 9 May = Student("May",90)        
10 Peter = Student("Peter",85)        

?

  定義類的方法:除了第一個參數是self外,其他和普通函數一樣。

  實例調用方法:只需要在實例變量上直接調用,除了self不用傳遞,其他參數正常傳入;注意,若類的方法僅需要self,不需要其他,調用該方法時,僅需 instance_name.function_name()

  這樣一來,我們從外部看Student類,就只需要知道,創建實例需要給出name和score,而如何打印,都是在Student類的內部定義的,這些數據和邏輯被“封裝”起來了,調用很容易,但卻不用知道內部實現的細節。

  封裝的另一個好處是可以給Student類增加新的方法;這邊的方法也可以要求傳參,如新增定義compare 函數,如下:

 1 class Student(object):
 2     def __init__(self, name, score): 
 3         self.name = name
 4         self.score = score
 5 
 6     def print_score(self):
 7         print("{self.name}'s score is: {self.score}".format(self=self))        # Python 2.7 + .format優化寫法
 8         
 9     def compare(self,s):
10         if self.score>s:
11             print("better than %d" %(s))
12         elif self.score==s:
13             print("equal %d" %(s))
14         else:
15             print("lower than %d" %(s))
16 
17 May = Student("May",90)        
18 Peter = Student("Peter",85)        
19 
20 May.print_score()
21 Peter.print_score()
22 
23 May.compare(100)
24 May.compare(90)
25 May.compare(89)

?

轉載于:https://www.cnblogs.com/feeland/p/4415645.html

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

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

相關文章

spss練習數據_SPSS篇——如何在成千上百萬個數據中標識重復個案

本文就帶大家來學習一個小技巧,如何運用SPSS標識重復個案。我們都知道在Excel中,通常會用到“篩選”功能來選出指定條件相同的單元格。那么在SPSS中,如何在成千上百萬個數據中篩選出重復的個案呢? 小編就是要告訴你,幾…

DOxygen for C++使用說明——Markdown支持

自Doxygen 版本1.8.0,Markdown被引進。 接下來,我們將先簡單介紹標準的Markdown語法,讀者可以進入Markdown官網查詢更詳細的細節。然后討論一下Doxygen支持的Markdown擴展,最后討論一下Doxygen對Markdown標準的實現細節。 Stand…

方程式漏洞之復現window2008/win7 遠程命令執行漏洞

前幾天就想寫的,因為一些緣故就沒寫。此次是在外網環境下進行的。大家在內網中也一個樣。 方法: 使用Eternalblue模塊,劍測是否有漏洞然后msf生成一個dll直接反彈shell. PS:win版本的不知道緣何生成出來的dll是0kb 我就在自己本地…

C++空類和string類

1. 空類 1.1 空類默認哪六個成員函數。 1 class Empty2 {3 public:4 Empty(); //缺省構造函數 Empty e;5 Empty( const Empty& ); //拷貝構造函數 Empty e2(e1);6 ~Empty(); //析構函數7 Empty& operator( const Empty& ); //賦值運算符…

客服會話 小程序 如何發起_小程序、公眾號、App三者如何融合布局?這里有一份避坑指南...

對產品經理來說,小程序無疑是2020年最火爆的詞之一了。我們能看到,就在今年疫情期間,小程序DAU達到4.5億,而超市、生鮮果蔬、社區購物等都同比增長100個點左右,小程序的商業價值很明顯地在快速釋放。小程序如此火爆&am…

DOxygen for C++使用說明——注釋代碼二

這一次我在谷歌搜索中檢索到了Doxygen在github的倉庫,進去一看,令人大喜,github倉庫里含有了一個Doxygen的官方配置文件Doxyfile,于是下載下來,發現Doxyfile已經配置了將倉庫中的\src文件編譯成Documentation,并且將結果放在了dox…

python super()(轉載)

一、問題的發現與提出 在Python類的方法(method)中,要調用父類的某個方法,在Python 2.2以前,通常的寫法如代碼段1: 代碼段1: class A:def __init__(self):print "enter A"print "…

Swagger+Spring mvc生成Restful接口文檔

2019獨角獸企業重金招聘Python工程師標準>>> Swagger 是一個規范和完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務。總體目標是使客戶端和文件系統作為服務器以同樣的速度來更新。文件的方法,參數和模型緊密集成到服務器端…

JavaScript——變量與基本數據類型

前言 JavaScript中的變量為松散類型,所謂松散類型就是指當一個變量被申明出來就可以保存任意類型的值,就是不像SQL一樣申明某個鍵值為int就只能保存整型數值,申明varchar只能保存字符串。一個變量所保存值的類型也可以改變,這在Ja…

vscode可以打開jupyternotebook嗎_剛剛,官方宣布 VS Code 支持 Python 全開發了!

關注Python高校每天早上23:10準時推送北京時間 2019 年 9 月 21 日,PyCon China 2019 在上海舉行。在下午的演講中,來自微軟開發工具事業部的資深研發工程師韓駿做了主題為《Python 與 Visual Studio Code 在人工智能應用中的最佳 Azure 實踐》的演講。在…

C++類的內聯成員函數應放在哪

今天復習C Primer的時候,看到了關于C類的內聯成員函數的放置,應該放在頭文件中。那么這到底是為什么 呢?僅僅是一種代碼規范問題還是必須這樣做呢? 下面我就來講講我自己的理解吧。要徹底理解這個問題,首先就要了解下函…

python selenium自動化(三)Chrome Webdriver的兼容

當一個自動化測試被實現在一個瀏覽器之后,我們會希望我們的測試能夠覆蓋到盡量多的別的瀏覽器。通過跨平臺的測試來保證我們的程序在多個瀏覽器下都能正常工作。 在安裝了selenium之后,firefox webdriver和IE webdriver就已經是ready to use的了&#xf…

NDK 編譯armebai-v7a的非4字節對齊crash Fatal signal 7 (SIGSEGV) 錯誤解決

一直都是編譯armabi的。沒有不論什么問題,這個架構是軟件模擬浮點運算的。后來看到NDK文檔上說armabi-v7a是針對有硬件處理浮點計算的arm cpu的。 于是就改動配置編譯armebai-v7a的so文件。 結果是編譯沒問題。一執行就是crash掉,Fatal signal 7 (SIGSEG…

作業三

作業三 第一章問題:書上寫的“Bug的多少可以直接衡量一個軟件的開發效率、用戶滿意度、可靠性和可維護性”,那么一個比較完好的軟件中一般大概會出現多少Bug? 第二章問題:現在開始訓練寫更多的程序能否更早地達到軟件工程師的標準&#xff1…

springboot默認數據源如何設置連接數_Spring Boot系列之配置數據庫連接池

在實際的應用開發中,與數據庫交互通常使用數據庫連接池來重用Connection對象,減少資源消耗。Spring Boot 的數據源是自動配置的。在 Spring Boot 2.2.1 版本中,有幾種數據源配置可選,它們按照 HikariCP -> Tomcat -> DBCP2 …

使用Qt正則表達式提取全路徑的文件名

問題描述: 給定三個全路徑,例如 path1"C:/Users/asus/Desktop/nefertiti_4465.obj"; path2"C:/Users/asus/Desktop/nefertiti_4465_k1.txt"; path3"C:/Users/asus/Desktop/nefertiti_4465_k2.txt"; 我希望說明path2和pa…

Beyond Compare 3.3.8 build 16340 + Key

本文摘錄自冰點社區:http://forum.z27315.com/topic/14746-beyond-compare-338-build-16340-key/ Download Beyond Compare 3 Current Version: 3.3.8, build 16340, released June 19, 2013 Windows 版本 Windows Standard and Pro EditionsEnglish version 5800k…

hdu 1198 Farm Irrigation

題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid1198 題目大意: 有一大塊土地需要澆水,這塊土地由很多的小塊土地(有十一種)組成,小塊土地上有水溝,問至少需要建幾個井,才能灌…

strcpy_s、sptintf_s與strcat_s的使用

strcpy_s、sptintf_s與strcat_s是strcpy、sptintf與strcat的安全版本,均是通過指定緩沖區長度來避免存在的溢出風險。 strcpy_s 與strcpy strcpy_s和strcpy函數的功能幾乎是一樣的。strcpy函數,就象gets函數一樣,它沒有方法來保證有效的緩沖…

小米一鍵上鎖工具_小米首款高端全自動智能鎖火熱預售中,一觸開啟全自動時代...

近些年,隨著科技的發展,人工智能逐漸走入大眾視野。人類社會也正從信息時代向“智能時代”過渡,在整個過程中智能家居領域的蓬勃發展可謂當仁不讓,一直備受用戶矚目。智能鎖作為家的第一道守護防線,家庭物聯網入口的關…