類:
理解類最簡單的方式:類是一個(gè)函數(shù)包,類中可以放置變量和函數(shù),然后類中的函數(shù)可以很方便的調(diào)用變量。
使用class來定義一個(gè)類
# 語法:創(chuàng)建一個(gè)名為“ClassName”的類,類名一般首字母要大寫,(): 不能丟
class ClassName():
# 如定義一個(gè)名為'狗'的類,可以寫成class Dog():
# 規(guī)范:class語句后續(xù)的代碼塊要縮進(jìn)
def function1():
# 定義類中的函數(shù)1
在類中被定義的函數(shù)被稱為類的【方法】,描述的是這個(gè)類能做什么。我們使用
類名.函數(shù)名()
的格式,就可以讓類的方法運(yùn)行起來
除了函數(shù)外,在類中還可以放置一堆變量,就像這樣:
class 類A():
變量1 = 100
變量2 = -5.83
變量3 = 'abc'
在類中被定義的變量被稱為類的【屬性】。使用
類名.變量名
的格式,可以把類中的屬性的值提取出來
不過類中的屬性(變量)也不是不能改變,使用
類名.變量名
的格式,可以讓我們在類的外面,增加或修改類的屬性
class 類A():
? ? 變量1 = 100
? ? 變量2 = -5.83
? ? 變量3 = 'abc'
類A.變量1 = 99
類A.變量4 = '新增一個(gè)變量'
print(類A.變量1)
print(類A.變量4)
看到這里,你可能會(huì)有有點(diǎn)疑惑,類方法也是函數(shù),那和我們之前學(xué)的單獨(dú)定義函數(shù)有什么區(qū)別嗎?
它們兩者最大的區(qū)別,一個(gè)是它的調(diào)用格式:
類.函數(shù)名()
比
函數(shù)名()
多了一個(gè)【類.】,但更重要的是,“類”中的函數(shù)可以利用“類”中的變量(也就是類方法可以調(diào)用類屬性)。
① 第一個(gè)格式
@classmethod
的中文意思就是“類方法”,
@classmethod
聲明了
函數(shù)1
是類方法,這樣才能允許
函數(shù)1
使用類屬性中的數(shù)據(jù)。
?
② 第二個(gè)格式
cls
的意思是
class
的縮寫。如果類方法
函數(shù)1
想使用類屬性(也就是類中的變量),就要寫上
cls
為
函數(shù)1
的第一個(gè)參數(shù),也就是把這個(gè)類作為參數(shù)傳給自己,這樣就能被允許使用類中的數(shù)據(jù)。
③ 第三個(gè)格式是
cls.變量
。類方法想使用類屬性的時(shí)候,需要在這些變量名稱前加上
cls.
。
?
這就好比
類方法
和
類
之間的約法三章,所以但凡有任何格式錯(cuò)誤都會(huì)報(bào)錯(cuò)。
?
?
?
?
?
?
類與對象
類是對象的模板
類的實(shí)例化:
直接使用類:
?
實(shí)例化后使用類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 直接使用類 class 成績單(): @classmethod def 錄入成績單(cls): cls.學(xué)生姓名 = input('請輸入學(xué)生姓名:') cls.語文_成績 = int(input('請輸入語文成績:')) cls.數(shù)學(xué)_成績 = int(input('請輸入數(shù)學(xué)成績:')) @classmethod def 打印成績單(cls): print(cls.學(xué)生姓名 + '的成績單如下:') print('語文成績:'+ str(cls.語文_成績)) print('數(shù)學(xué)成績:'+ str(cls.數(shù)學(xué)_成績)) 成績單.錄入成績單() 成績單.打印成績單() # 實(shí)例化之后 class 成績單(): # ①不用再寫@classmethod def 錄入成績單(self): # ②cls變成self self.學(xué)生姓名 = input('請輸入學(xué)生姓名:') # ③cls.變成self. self.語文_成績 = int(input('請輸入語文成績:')) self.數(shù)學(xué)_成績 = int(input('請輸入數(shù)學(xué)成績:')) def 打印成績單(self): print(self.學(xué)生姓名 + '的成績單如下:') print('語文成績:'+ str(self.語文_成績)) print('數(shù)學(xué)成績:'+ str(self.數(shù)學(xué)_成績)) 成績單1 = 成績單() # ④創(chuàng)建實(shí)例對象:成績單1 成績單1.錄入成績單() # ⑤實(shí)例化后使用 成績單1.打印成績單()
當(dāng)我們完成實(shí)例化后,對應(yīng)于一個(gè)實(shí)例的屬性和方法,叫“實(shí)例屬性、實(shí)例方法”,不再稱為“類屬性、類方法”:
?
類和實(shí)例的關(guān)系,就像母體和復(fù)制品的關(guān)系一樣。當(dāng)一個(gè)類實(shí)例化為多個(gè)實(shí)例后,實(shí)例將原封不動(dòng)的獲得類屬性,也就是
實(shí)例屬性
和
類屬性
完全相等。
我們可以修改類屬性,這會(huì)導(dǎo)致所有實(shí)例屬性變化(因?yàn)轭愂悄0澹?
我們也可以修改實(shí)例屬性,但這不會(huì)影響到其他實(shí)例,也不會(huì)影響到類。因?yàn)?
每個(gè)實(shí)例都是獨(dú)立的個(gè)體
新增也是一樣的道理,在類中新增屬性會(huì)影響到實(shí)例,但在實(shí)例中新增屬性只影響這個(gè)實(shí)例自己
?
和類屬性一樣,我們可以重寫類方法,這會(huì)導(dǎo)致所有實(shí)例方法自動(dòng)被重寫
“重寫類方法”分成兩個(gè)步驟:第一個(gè)步驟是在類的外部寫一個(gè)函數(shù),第二個(gè)步驟是把這個(gè)新函數(shù)的名字賦值給
類.原始函數(shù)
?
要注意的是,這里的賦值是在替換方法,并不是調(diào)用函數(shù),所以【不要加上括號】—— 寫成
類.原始函數(shù)() = 新函數(shù)()
是錯(cuò)誤的。
?
我們可以通過重寫類方法,讓實(shí)例方法發(fā)生變化,但我們不能重寫實(shí)例方法,模板給的技能不是說換就能換的。
?
初始化函數(shù):
初始化函數(shù)
的意思是,當(dāng)你創(chuàng)建一個(gè)實(shí)例的時(shí)候,這個(gè)函數(shù)就會(huì)被調(diào)用。上面的代碼在執(zhí)行
實(shí)例 = 類()
的語句時(shí),就自動(dòng)調(diào)用了
__init__(self)
函數(shù)。
?
初始化函數(shù)
的寫法是固定的格式:中間是“init”,這個(gè)單詞的中文意思是“初始化”,然后前后都要有【兩個(gè)下劃線】,然后
__init__()
的括號中,第一個(gè)參數(shù)一定要寫上
self
,不然會(huì)報(bào)錯(cuò)。
?
class 成績單(): def __init__(self,學(xué)生姓名,語文_成績,數(shù)學(xué)_成績): self.學(xué)生姓名 = 學(xué)生姓名 self.語文_成績 = 語文_成績 self.數(shù)學(xué)_成績 = 數(shù)學(xué)_成績 def 打印成績單(self): print(self.學(xué)生姓名 + '的成績單如下:') print('語文成績:'+ str(self.語文_成績)) print('數(shù)學(xué)成績:'+ str(self.數(shù)學(xué)_成績)) 成績單1 = 成績單('張三',99,88) 成績單2 = 成績單('李四',64,73) 成績單3 = 成績單('王五',33,22) 成績單1.打印成績單() 成績單2.打印成績單() 成績單3.打印成績單()
繼承
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
