目錄
一、兩種編程思維
1.面向過程編程,看重的是解決問題的過程。
面向過程編程,主要用到的是“函數”知識,將每個過程步驟打包成函數,再依次調用。
2.面向對象編程主要用到的是“類和對象”知識。
3.例:現在接到的一個需求是:做一道西紅柿炒雞蛋。
面向過程的做法:自己按照炒菜的步驟親手製作一道西紅柿炒雞蛋。
面向對象的做法:製作一臺炒菜機器人,然後告訴機器人做一道西紅柿炒雞蛋。
二、類
【類】是一個函數包。類中可以放置函數和變量,然後類中的函數可以很方便的使用類中的變量。
1.類中可以放函數和變量
(1)用法
用def
語句來自定義一個函數,我們用class
語句來自定義一個類。
在類中被定義的函數被稱爲類的【方法】,描述的是這個類能做什麼。我們使用類名.函數名()
的格式,就可以讓類的方法運行起來。
在類中被定義的變量被稱爲類的【屬性】。使用類名.變量名
的格式,可以把類中的屬性的值提取出來。
# 語法:創建一個名爲“ClassName”的類,類名一般首字母要大寫,(): 不能丟
class ClassName():
# 如定義一個名爲'狗'的類,可以寫成class Dog():
# 規範:class語句後續的代碼塊要縮進
def function1():
# 定義類中的函數1
例1:
class 智能機器人():
胸圍 = 33
腰圍 = 44
臀圍 = 55
def 打招呼():
print('主人你好!')
def 賣萌():
print('主人,求抱抱!')
def 生氣():
print('主人,我要報警了!')
print('把類的屬性打印出來:')
print(智能機器人.胸圍)
print(智能機器人.腰圍)
print(智能機器人.腰圍)
智能機器人.打招呼()
智能機器人.賣萌()
智能機器人.生氣()
(2)類方法與函數的區別
一個是它的調用格式:類.函數名()
比函數名()
多了一個【類.】,但更重要的是,“類”中的函數可以利用“類”中的變量(也就是類方法可以調用類屬性)。具體體現在第2節。
2.類方法和類屬性可以組合
爲了把類中的變量傳遞給類中的函數,我們需要用到3個特定格式:
① 第一個格式@classmethod
的中文意思就是“類方法”,@classmethod
聲明瞭函數1
是類方法,這樣才能允許函數1
使用類屬性中的數據。
② 第二個格式cls
的意思是class
的縮寫。如果類方法函數1
想使用類屬性(也就是類中的變量),就要寫上cls
爲函數1
的第一個參數,也就是把這個類作爲參數傳給自己,這樣就能被允許使用類中的數據。
③ 第三個格式是cls.變量
。類方法想使用類屬性的時候,需要在這些變量名稱前加上cls.
。
另外,當類中的函數【不需要】用到類中的變量時,就不要用@classmethod
、cls
、cls.
三處格式,否則就是佔着茅坑不拉屎,終端也會給你報錯。
'''【正確案例】'''
class 類A():
變量1 = 100
變量2 = 200
def 函數1(): # 【不需要】使用類屬性
print('我不需要使用類屬性。')
@classmethod
def 函數2(cls): # 【需要】使用類屬性
print(cls.變量1)
print(cls.變量2)
類A.函數1()
類A.函數2()
三.類的相關
1.給類方法傳參
(1)類方法僅使用外部參數
一首詩 = ['《卜算子》','我住長江頭,','君住長江尾。','日日思君不見君,','共飲長江水。']
class 唸詩類():
def 唸詩函數(參數):
for i in 參數:
print(i)
唸詩類.唸詩函數(一首詩)
(2)類方法僅使用內部參數
class 唸詩類():
一首詩 = ['《卜算子》','我住長江頭,','君住長江尾。','日日思君不見君,','共飲長江水。']
@classmethod
def 唸詩函數(cls):
for i in cls.一首詩:
print(i)
唸詩類.唸詩函數()
(3)類方法同時使用內部參數和外部參數
class 唸詩類():
一首詩 = ['《卜算子》','我住長江頭,','君住長江尾。','日日思君不見君,','共飲長江水。']
@classmethod
def 唸詩函數(cls,參數1):
print('念給%s的詩:'%參數1)
for i in cls.一首詩:
print(i)
參數1 = input('唸詩給誰聽?')
唸詩類.唸詩函數('張三')
當類方法要使用多個外部參數時,我們要多預設幾個參數位置。比如:
class 加100類():
變量 = 100
@classmethod
def 加100函數(cls,參數1,參數2,參數3):
總和 = cls.變量 + 參數1 + 參數2 + 參數3
print('加100函數計算結果如下:')
print(總和)
參數1 = int(input('請輸入一個整數:'))
參數2 = int(input('請輸入一個整數:'))
參數3 = int(input('請輸入一個整數:'))
加100類.加100函數(參數1,參數2,參數3)
2.增加/修改類屬性
有兩種途徑來增加或修改類屬性。一種是從內部,用類方法
去增加/修改;另一種是從外部,用類.變量 = xx
直接增加/修改類屬性。
(1)從外部增加/修改屬性
class 幸運():
@classmethod
def 好運翻倍(cls):
print('好的,我把它存了起來,然後翻了888倍還給你:' + str(cls.幸運數*888))
# 或者這樣寫也可以:
# print('好的,我把它存了起來,然後翻了888倍還給你:%d' % (cls.幸運數*888))
幸運.幸運數 = int(input('你的幸運數是多少?請輸入一個整數。'))
幸運.好運翻倍()
(2)從內部增加/修改屬性
class 唸詩類():
一首詩 = ['《卜算子》','我住長江頭,','君住長江尾。','日日思君不見君,','共飲長江水。']
@classmethod
def 唸詩函數(cls):
cls.接收人 = input('請輸入你想給誰唸詩:')
print('念給'+ cls.接收人 +'的詩:')
for i in cls.一首詩:
print(i)
唸詩類.唸詩函數()
3.案例
類方法不但能調用類屬性,還能直接調用其他類方法。
class 成績單():
@classmethod
def 錄入成績單(cls):
cls.學生姓名 = input('請輸入學生姓名:')
cls.語文_成績 = int(input('請輸入語文成績:'))
cls.數學_成績 = int(input('請輸入數學成績:'))
@classmethod
def 計算平均分(cls):
平均分 = (cls.語文_成績 + cls.數學_成績)/2
return 平均分
@classmethod
def 評級(cls):
平均分 = cls.計算平均分()
if 平均分>=90:
print(cls.學生姓名 + '的評級是:優')
elif 平均分>= 80 and 平均分<90 :
print(cls.學生姓名 + '的評級是:良')
elif 平均分>= 60 and 平均分<80 :
print(cls.學生姓名 + '的評級是:中')
else:
print(cls.學生姓名 + '的評級是:差')
成績單.錄入成績單()
成績單.評級()
在def 評級(cls)
中有一句cls.計算平均分()
,這句代碼可以調用類方法計算平均分()
,在這個類方法中,用return語句保存了平均分,然後賦值給def 評級(cls)
中的變量平均分
。這裏有個小點要注意,def 評級(cls)
中的平均分
和def 計算平均分(cls)
的平均分
,是兩個不同的變量,因爲它們在不同的函數下工作,作用域不同。