【Python從入門到精通】(十三)Python面向對象的開發,沒有對象怎么能行呢?|【生長吧!Python】
您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦。
Python是一門面向對象的語言,所以,本文將詳細介紹面向對象的思想介紹類,對象以及方法。
干貨滿滿,建議,需要用到時??纯?。 小伙伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~。
前言
何為面向對象?
類
對象
屬性
方法
類的定義
構造方法
類對象的創建和使用
self參數的詳解
類的變量
實例方法,靜態方案和類方法詳解
繼承
總結
前言
說點題外話:這兩天看到鄭州市區洪災的視頻真的很讓人心痛,洪水真的太可怕了。不過,在天災面前我們中華兒女團結一致,眾志成城。社會各界捐款捐物馳援河南。我看了一幕幕感人的景象,感受到了中國人力量。 作為一個普通人的我覺得應該盡一點點綿薄之力。
今天要介紹的主題是Python的類和對象,重點介紹面向對象的思想以及類的屬性和方法。
何為面向對象?
作為一個從Java開發工程師的我對面向對象這個名詞是在熟悉不過了。面向對象的三個特性:封裝,繼承和多態。同樣的Python作為面向對象的語言也是有這三個特性的,本文將詳細介紹其中的兩個特性:封裝和繼承。那么何為面向對象呢?面向對象(Object-oriented Programming,簡稱 OOP)的思想其本質上是一種對事物抽象封裝的思想。
封裝就是將隱藏具體的細節內容,就好像用戶使用電腦,只需要簡單的操作鍵盤和鼠標就可以實現一些功能。而無需了解計算機內部是如何實現的。
而在Python語言中的面向對象的封裝是將描述特性的數據(屬性)和描述行為(方法)封裝在一起。
比如現在要描述一個人的話,我們首先會從兩方面描述:
從表面特征描述:例如: 膚色,身高,體重,年齡
從所具有的行為描述:例如:會吃飯,會走路,會說話。
如果通過代碼來實現的話,其表面特征可以用變量來表示,其行為可以用各種方法來表示。
class Person: # 膚色 colour = '黃色' # 身高 height = '180cm' # 體重 weight = '60KG' # 年齡 age = 18 def eat(self): print('吃飯') def walk(self): print('走路') def speak(self): print('說話') zhangsan=Person() lisi=Person() wanger=Person()
通過構建一個Person類就可以將人的特性和行為都封裝起來。人都是有共性的,也就是說可以通過這個類來創建出各種不同的對象。這里不得不說面向對象里的幾個核心概念。
類
類可以理解成可以理解成是一個模板,根據這個模板可以創建出許許多多的具體對象,可以把類想象成是一個模子亦或者是一張圖紙。
對象
類并不能直接直接被使用, 通過類創建出來的具體的實例(又稱為對象)才能被使用。這就像汽車的圖紙與車本身的關系。大多數情況下,圖紙并不能被普通人所使用,但是通過圖紙創建出的一輛輛汽車能被使用。就像上面通過Person類可以創造出張三,李四,王二麻子。
zhangsan=Person() lisi=Person() wanger=Person()
屬性
類中所有的變量都是類的屬性,比如上面的身高height,體重weight等屬性。
方法
類中的所有函數都被稱為方法,不過,和函數有所不同的是類方法至少要包含一個 self 參數(后續會做詳細介紹)。就像上面Person類的eat方法,walk方法。另外,就是類中的方法不能單獨使用,必須通過類創建的對象調用。
類的定義
類的定義必須要通過class關鍵字修飾,類名的命名規范建議是每個單詞的首字母大寫,其余字母小寫。
class 類名: 多個(>=0)類屬性 多個(>=0)類的方法
就像上面的Person類,其有屬性height,weight等幾個屬性。也有eat,walk等多個方法。
構造方法
不過這里有個隱藏的方法,那就是類構造方法__init__()。該方法是一個特殊的類實例方法。Python是通過該方法來創建類的實例。該方法的方法名是固定的,開頭和結尾各有2個下劃線并且中間不能有空格。
在創建類之后,Python會創建一個默認的構造方法__init__()。如果沒有手動添加__init__()方法的話則使用默認的構造方法創建類的實例(即對象)。 __init__()方法的語法結構是:
def __init__(self,...): 代碼塊
__init__()方法可以有多個參數,但必須包含一個名為self的參數,并且self的參數必須為第一個參數,如果沒有其他參數則是默認構造方法。以上面的Person類為例,可以手動添加一個帶其他參數的__init__()方法。
def __init__(self, head): self.hand = head
如果手動添加了其他的__init__()方法,則會覆蓋掉默認的構造方法。創建對象時會使用你手動添加的__init__()方法。
類對象的創建和使用
創建類對象的過程被稱為類的實例化,其語法結構是類名(參數), 當使用的是默認構造方法時或者添加的__init__()方法中僅有一個self參數,則創建類對象時參數可以不寫。
但是如果__init__()方法中除了self參數還有其他參數的話,則參數必傳。不然,就會報類似于下面的錯誤。
Traceback (most recent call last): File "/Python_learn/PycharmProjects/python_demo_1/demo/oop/person.py", line 15, in
這里就必須要傳入head參數。
person = Person('頭') person.eat()
self參數的詳解
前面幾個章節我們多次提到了self參數,那么這個參數到底有啥作用呢?我們知道類是一個模板,通過類這個模板可以創建出許許多多的對象。那么該如何區分這些對象呢?就像每個人都有自己的名字一樣,實例化的對象在Python中也有屬于自己的代號(自身的引用)。而python正是通過self參數來綁定調用對象本身。說白了就是通過self參數可以知道當前的方法是被誰調用了。專業一點的解釋是,當某個對象調用類方法時,該方法會把自身的引用作為第一個參數自動傳給該方法。
class Person: def __init__(self): print('正在執行構造方法') def eat(self): print(self, '正在吃飯') zhangsan = Person() zhangsan.eat() lisi = Person() lisi.eat()
其運行結果是:
正在執行構造方法 <__main__.Person object at 0x1031cd0f0> 正在吃飯 正在執行構造方法 <__main__.Person object at 0x103338da0> 正在吃飯
這里實例化了zhangsan和lisi兩個對象。當他們同時調用eat方法時,Python會將其自身的引用綁定到self參數上,可以明顯的看出不同的調用者其self參數是不同的。這里的self參數就相當于是Java里的this參數。
類的變量
類的變量有三種,分別是類變量,實例變量和局部變量。下面直接舉個例子吧!下面代碼定義了一個Person類,該類定義了了三個變量,兩個方法。
class Person: name = '張三' def __init__(self): self.age = 18 def get_info(self): sex = '男' print('局部變量sex=', sex) return sex print('類屬性name=', Person.name) person = Person() print('實例屬性age=', person.age) person.get_info()
運行結果是:
類屬性name= 張三 實例屬性age= 18 局部變量sex= 男
這里name,age以及sex三個變量分別是三種不同的變量。下面就分別介紹一下
其中定義在了類體中,所有函數之外;此范圍定義的變量就稱為類變量,就像上面代碼中的name變量。類變量屬于整個類??梢灾苯油ㄟ^類名.變量名來獲取,就像上面的Person.name。在實際開發中類變量用的比較少。
定義在類體中,函數內部并且以self.變量名定義的變量就稱為實例變量。就像上面代碼中的age變量。實例變量只作用于調用方法的對象,只能通過對象名訪問,無法通過類名訪問。調用方式如上面實例中的person.age。
定義在類體中,函數內部的變量以"變量名=變量值"的方式定義的變量就稱為局部變量。就像上面代碼中的sex變量,局部變量只能在函數內部使用。
實例方法,靜態方案和類方法詳解
前面介紹完了類中各種類型的變量,接下來就是介紹類中的方法了。類中的方法也可以分為3種。分別是:
類實例方法
類中的方法默認是類實例方法,該類型方法的特點是其最少包含一個self參數用于綁定調用此方法的實例對象,就像上面的get_info方法。這種類型的方法也是在實際開發中最常用的一種方法。
類方法
類方法:通過@classmethod注解修飾并且方法參數最少包含一個cls參數的方法叫做類方法。類方法同樣屬于類,可以通過類名直接調用。需要特別注意的還cls參數的參數名不能修改,不然調用會報錯。
類靜態方法
靜態方法定義在類這個空間(類命名空間)中,而函數則是定義在程序所在的空間(全局命名空間)中。
class Person: # 類實例方法 def test_selfmethod(self): print('這是一個類實例方法') # 類方法 @classmethod def test_classmethod(cls): print('這是一個類方法') # 靜態方法 @staticmethod def test_staticmethod(name): print('這是一個靜態方法', name) person = Person() print(person.test_selfmethod()) print(Person.test_classmethod()) print(Person.test_staticmethod('碼農飛哥'))
運行結果是:
這是一個類實例方法 None 這是一個類方法 None 這是一個靜態方法 碼農飛哥 None
繼承
說完了封裝,接著說下繼承吧。就像根據兒子能找到爸爸一樣。在Python中object類是作為其他所有類的基類。默認的話創建的類都是繼承object類。也可以顯示的指定繼承的類。
class ParentPerson(object): weight = 150 height = 180 def eat(self, name): print(name + '開始吃飯') class SonPerson(ParentPerson): pass sonPerson = SonPerson() sonPerson.eat('兒子')
運行結果是:兒子開始吃飯
如上代碼,ParentPerson類顯示指定了其父類object。SonPerson類顯示指定了其父類ParentPerson。在SonPerson類中沒有定義任何的方法和屬性。但是由于其繼承了ParentPerson類也就用來了使用ParentPerson類中屬性和方法的權利。所以sonPerson對象可以調用eat方法。
總結
本文詳細介紹面向對象的思想,以及面向對象的幾個核心概念。分別是類,對象,屬性,方法。總而言之:類是一個模板,用來將事物的特性和行為封裝起來。而對象則是一個個具體的事物。屬性用來表示事物的特性。方法用來表示事物的行為。
我是碼農飛哥,再次感謝您讀完本文。
【生長吧!Python】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/278897
Python 面向對象編程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。