您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦,
Python是一門面向物件的語言,所以,本文將詳細介紹面向物件的思想介紹類,物件以及方法,
干貨滿滿,建議收藏,需要用到時常看看, 小伙伴們如有問題及需要,歡迎踴躍留言哦~ ~ ~,
文章目錄
- 前言
- 何為面向物件?
- 類
- 物件
- 屬性
- 方法
- 類的定義
- 構造方法
- 類物件的創建和使用
- self引數的詳解
- 類的變數
- 實體方法,靜態方案和類方法詳解
- 繼承
- 總結
- Python知識圖譜
前言
說點題外話:這兩天看到鄭州市區洪災的視頻真的很讓人心痛,洪水真的太可怕了,不過,在天災面前我們中華兒女團結一致,眾志成城,社會各界捐款捐物馳援河南,我看了一幕幕感人的景象,感受到了中國人力量, 作為一個普通人的我覺得應該盡一點點綿薄之力,

今天要介紹的主題是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 <module>
person = Person()
TypeError: __init__() missing 1 required positional argument: 'head'
這里就必須要傳入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知識圖譜
為了更好幫助更多的小伙伴對Python從入門到精通,我從CSDN官方那邊搞來了一套 《Python全堆疊知識圖譜》,尺寸 870mm x 560mm,展開后有一張辦公桌大小,也可以折疊成一本書的尺寸,有興趣的小伙伴可以了解一下------掃描下圖中的二維碼即可購買,

我本人也已經用上了,感覺非常好用,圖譜桌上放,知識心中留,

我是碼農飛哥,再次感謝您讀完本文,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/290100.html
標籤:python
