Python面向對象編程(一)

来源:http://www.cnblogs.com/zhang-can/archive/2017/07/02/7107271.html
-Advertisement-
Play Games

1.什麼是面向對象 面向對象(oop)是一種抽象的方法來理解這個世界,世間萬物都可以抽象成一個對象,一切事物都是由對象構成的。應用在編程中,是一種開發程式的方法,它將對象作為程式的基本單元。 2.面向對象與面向過程的區別 我們之前已經介紹過面向過程了http://www.cnblogs.com/zh ...


1.什麼是面向對象

面向對象(oop)是一種抽象的方法來理解這個世界,世間萬物都可以抽象成一個對象,一切事物都是由對象構成的。應用在編程中,是一種開發程式的方法,它將對象作為程式的基本單元。

2.面向對象與面向過程的區別

我們之前已經介紹過面向過程了http://www.cnblogs.com/zhang-can/p/7050182.html,面向過程的核心在‘過程’二字,過程就是解決問題的步驟,面向過程的方法設計程式就像是在設計一條流水線,是一種機械式的思維方式

  優點:複雜的問題簡單化,流程化

  缺點:擴展性差

  主要應用場景有:Linux內核,git,以及http服務

面向對象的程式設計,核心是對象,對象就是特征(變數)與技能(函數)的結合體。

  優點:解決了程式擴展性差的問題

  缺點:可控性差,無法預測最終結果

  主要應用場景是需求經常變化的軟體,即與用戶交互比較頻繁的軟體

需要註意的是:面向對象的程式設計並不能解決全部問題,只是用來解決擴展性。當然,現在的的互聯網軟體,擴展性是最重要的

3.對象與類的概念

在python中,一切皆對象,一個對象應該具有自己的屬性,也就是特征,還有有自己的功能,即方法

在Python中,特征用變數表示,功能用函數表示,所以對象就是變數與函數的結合體

而從各種各樣的對象中抽取出來具有相同特征和相同功能組成的,就是類,所以說類是一系列對象共同特征與功能的結合體

下麵讓我們來定義一個類,方法與定義一個函數有些類似:

#定義一個中國人的類
class Chinese:
    #共同的特征
    country='China'
    
    #共同的技能
    def talk(self):
        print('is talking Chinese')
    def eat(self):
        print('is eating Chinese food')

這樣我們就定義好了一個類,註意:1.定義類用class關鍵字

                2.類名一般首字母大寫,且冒號前面不需要括弧,區別於函數定義
                3.與函數不同,類在定義階段就會執行類裡面的代碼

                4.類有兩種屬性,共同的特征叫數據屬性,共同的功能叫函數屬性

怎樣由這個類產生一個對象呢?實例化:

#實例化的方式產生一個對象
p1=Chinese()
p2=Chinese()

我們可以得出結論了,不管現實世界中怎麼樣,但是在程式中,確實是先有類,才有的對象

我們已經通過實例化的方式得到兩個對象了,但是有一個問題,得到的兩個對象,特征和功能都是一樣的,這根萬物皆對象的理念完全不符啊,應該是每個對象都是不同的,這樣的世界才有意思啊

事實上,我們在定義類的時候,忘記了定義 __init__() 這個函數,正確的定義方法應該是這樣的:

#定義一個中國人的類
class Chinese:
    #共同的特征
    country='China'

    #初始化
    def __init__(self,name,age):
        self.name=name  #每個對象都有自己的名字
        self.age=age    #每個對象都有自己的年齡
    #共同的技能
    def talk(self):
        print('is talking Chinese')
    def eat(self):
        print('is eating Chinese food')

#實例化的方式產生一個對象
p1=Chinese('zhang',18)

類名加括弧就是實例化,實例化就會自動觸發__init__ 函數運行,可以用它來為每個對象定製自己的特征

我們在定義__init__函數的時候,括弧里有三個參數,但是我們實例化調用的時候卻只傳了兩個值,為什麼不報錯呢?這是因為self的作用就是:實例化的時候,自動將對象本身傳給__init__函數的第一個參數,當然self只是個名字了,egon老師說瞎幾把寫別人就看不懂了。

註意。這種自動傳值的機制只是在實例化的時候才會體現,類除了實例化還有一種作用就是屬性引用,方法是類名.屬性

#引用類的數據屬性
print(Chinese.country)  #China

#引用類的函數屬性
# Chinese.talk()#TypeError: talk() missing 1 required positional argument: 'self'
print(Chinese.talk) #<function Chinese.talk at 0x000001BC5F13D1E0>
Chinese.talk('self')    #is talking Chinese

#增加屬性
Chinese.color='yellow'
#刪除屬性
del Chinese.color

從上面報錯的代碼可以看出,屬性引用的時候,沒有自動傳值這回事

我們學過名稱空間的概念,定義一個變數,或者定義一個函數都會在記憶體中開闢一塊記憶體空間,類裡面也有定義變數(數據屬性),定義函數(函數屬性),他們也有名稱空間,可以通過.__dict__的方法查看

p1=Chinese('zhang',18)
print(Chinese.__dict__)
#{'__module__': '__main__', 'country': 'China', '__init__': <function Chinese.__
# init__ at 0x000002187F35D158>, 'talk': <function Chinese.talk at 0x000002187F35D1E0>, 
# 'eat': <function Chinese.eat at 0x000002187F35D268>, '__
# dict__': <attribute '__dict__' of 'Chinese' objects>,
#  '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None}
print(p1.__dict__)
#{'name': 'zhang', 'age': 18}

通過上面代碼顯示的結果我們知道了,列印實例化後的對象的名稱空間,只顯示自己特有的屬性,如果想要找到和其他對象共有的屬性,就要去類的名稱空間裡面去找

還有一個問題,對象的名稱空間中沒有函數屬性,當然也是去類裡面找,但是不同對象指定的函數,是一個函數嗎

p1=Chinese('zhang',18)
p2=Chinese('li',19)
print(Chinese.talk)#<function Chinese.talk at 0x000001B8A5B7D1E0>
print(p1.talk)     #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BD68>>
print(p2.talk)     #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BDA0>>

可以看到,並不是,他們的記憶體地址都不一樣。而且註意bound method,是綁定方法

對象本身只有數據屬性,但是Python的class機制將類的函數也綁定到對象上,稱為對象的方法,或者叫綁定方法。綁定方法唯一綁定一個對象,同一個類的方法綁定到不同的對象上,屬於不同的方法。我們可以驗證一下:

當用到這個函數時:類調用的是函數屬性,既然是函數,就是函數名加括弧,有參數傳參數

而對象用到這個函數時,對象沒有函數屬性,他是綁定方法,綁定方法怎麼用呢,也是直接加括弧,但不同的是,綁定方法會預設把對象自己作為第一個參數

class Chinese:
    country='China'
    def __init__(self,name,age):
        self.name=name  
        self.age=age    
    def talk(self):
        print('%s is talking Chinese'%self.name)
    def eat(self):
        print('is eating Chinese food')

p1=Chinese('zhang',18)
p2=Chinese('li',19)
Chinese.talk(p1)    #zhang is talking Chinese
p1.talk()           #zhang is talking Chinese

只要是綁定方法,就會自動傳值!其實我們以前就接觸過這個,在python3中,類型就是類。數據類型如list,tuple,set,dict這些,實際上也都是類,我們以前用的方法如l1.append(3),還可以這樣寫:l1.append(l1,3)

未完待續。。。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在看smartSql源碼,兄弟寫的。寫的很不錯取取經。 記錄下一些學習的東西,剛開始我先不系統的寫了,隨意一點哈,我看的差不多再給大家一個模塊一個模塊系統的寫。 Run方法 sqlRunner第三個參數重點強調下,傳入的是一個委托,返回的是一個泛型T 委托了一個方法傳入,很多人會疑惑這兩個參數我 ...
  • 一、創建數據服務 1.在“解決方案資源管理器”中,使用滑鼠左鍵選中“WcfService”項目,然後在菜單欄上,依次選擇“項目”、“添加新項”。 2.在“添加新項”對話框中,選擇“Web”節點,然後選擇“WCF 服務”項。 3.在“名稱”文本框中,輸入 BookService,然後選擇“添加”按鈕。 ...
  • 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面講到:Spring+SpringMVC+MyBatis深入學習及搭建(十五)——SpringMVC註解開發(基礎篇) 本文主要內容: (1)SpringMVC校驗 (2)數據回顯 ( ...
  • 本文分析了HashMap的實現原理,以及resize可能引起死迴圈和Fast-fail等線程不安全行為。同時結合源碼從數據結構,定址方式,同步方式,計算size等角度分析了JDK 1.7和JDK 1.8中ConcurrentHashMap的實現原理。 ...
  • 【面向對象基礎】【封裝和繼承】【PHP關鍵字】【單例】【對象串列化和魔術方法】【抽象類和抽象方法】【介面與多態】 ...
  • 不解釋,直接上代碼: ...
  • 為了更好的備戰NOIP2013,電腦組的幾個女孩子LYQ,ZSC,ZHQ認為,我們不光需要機房,我們還需要運動,於是就決定找校長申請一塊電腦組的課餘運動場地,聽說她們都是電腦組的高手,校長沒有馬上答應他們,而是先給她們出了一道數學題,並且告訴她們:你們能獲得的運動場地的面積就是你們能找到的這個最大的 ...
  • 題目描述 在平面上有 n 個點(n <= 50),每個點用一對整數坐標表示。例如:當 n=4 時,4個點的坐標分另為:p1(1,1),p2(2,2),p3(3,6),P4(0,7),見圖一。 這些點可以用 k 個矩形(1<=k<=4)全部覆蓋,矩形的邊平行於坐標軸。當 k=2 時,可用如圖二的兩個矩 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...