一、方法總體介紹
方法:實現(xiàn)某一個功能的程序塊,在類里面以def開頭的,是類中的基本組成成分。
類方法加關(guān)鍵字
@classmethod
靜態(tài)方法加關(guān)鍵字
@staticmethod
我們寫一個類,在里面分別定義:實例方法、類方法、靜態(tài)方法:
class Person:
person_number = 0
def __init__(self,name,gender): # 構(gòu)造方法:用來給對象初始化
self.name = name
self.gender = gender
def say_hello(self): # 實例方法 --- 應(yīng)用在具體的對象上
print("大家好,我叫"+self.name+",我是"+self.gender+"生!")
Person.person_number += 1
@classmethod
def print_person_number(cls): # 類方法 --- 應(yīng)用在類上
print("當(dāng)前有:"+str(cls.person_number)+"人!")
@staticmethod
def print_welcome(person_name:str): # 靜態(tài)方法 --- 應(yīng)用在類上
print("歡迎您"+person_name)
if __name__ == '__main__':
peter = Person("peter","男")
# 調(diào)用實例方法
peter.say_hello()
# 調(diào)用類方法
Person.print_person_number()
# 調(diào)用靜態(tài)方法
Person.print_welcome("Alice")
二、實例方法
1. 知識儲備
(1)實例方法實際占用的是類空間,實例化一個對象后,對象會綁定這個實例方法;
(2)使用對象名.方法名調(diào)用實例方法;
(3)self是一個指向?qū)ο蟮闹羔?,使用self關(guān)鍵字調(diào)用當(dāng)前對象的實例變量。
2. 實例方法的案例
為了鞏固實例方法的知識,我們做一個綜合案例:使用Tkinter搭建一個提交學(xué)生信息的窗體。
提交學(xué)生信息前應(yīng)滿足的條件:
- 學(xué)號:95開頭的6位數(shù)
- 姓名:漢字(2-10)
- 性別:只能填寫男或者女
- 手機號碼:11位數(shù)字
- 郵箱地址:滿足基本格式
如果都滿足條件,提交的時候跳出提示框“添加成功”
如果有一個不滿足條件,跳出提示框并提示具體的哪一個不滿足條件。
from tkinter import *
from tkinter.ttk import *
from tkinter.messagebox import *
import re
class Add_Student(Tk):
def __init__(self):
super().__init__()
self.title("添加學(xué)生")
self.resizable(0,0)
self.geometry("420x350+350+150")
self["bg"] = "whitesmoke"
self.setup_UI()
def setup_UI(self):
self.style01 = Style()
self.style01.configure("TLabel",font=("微軟雅黑",20,"bold"))
self.style01.configure("TButton", font=("微軟雅黑", 20, "bold"))
self.Label_sno = Label(self,text="學(xué)號:")
self.Label_sno.place(x=80,y=20)
self.var_sno = StringVar()
self.Entry_sno = Entry(self,textvariable = self.var_sno,width=10,font=("微軟雅黑",20,"bold"))
self.Entry_sno.place(x=150,y=20)
self.Label_name = Label(self, text="姓名:")
self.Label_name.place(x=80, y=70)
self.var_name = StringVar()
self.Entry_name = Entry(self,textvariable = self.var_name,width=10, font=("微軟雅黑", 20, "bold"))
self.Entry_name.place(x=150,y=70)
self.Label_gender = Label(self, text="性別:")
self.Label_gender.place(x=80, y=120)
self.var_gender = StringVar()
self.Entry_gender = Entry(self,textvariable = self.var_gender, width=10, font=("微軟雅黑", 20, "bold"))
self.Entry_gender.place(x=150, y=120)
self.Label_mobile = Label(self, text="手機:")
self.Label_mobile.place(x=80, y=170)
self.var_mobile = StringVar()
self.Entry_mobile = Entry(self,textvariable = self.var_mobile,width=15, font=("微軟雅黑", 20, "bold"))
self.Entry_mobile.place(x=150, y=170)
self.Label_email = Label(self, text="郵箱:")
self.Label_email.place(x=80, y=220)
self.var_email = StringVar()
self.Entry_email = Entry(self,textvariable = self.var_email, width=15, font=("微軟雅黑", 20, "bold"))
self.Entry_email.place(x=150, y=220)
self.Button_submit = Button(self,text = "提交",command = self.check_input)
self.Button_submit.place(x = 280,y=290)
def check_input(self):
# 獲取輸入的值
sno = self.var_sno.get()
name = self.var_name.get()
gender = self.var_gender.get()
mobile = self.var_mobile.get()
email = self.var_email.get()
# 實例化
current = Student(sno,name,gender,mobile,email)
# 校驗輸入
check_result = current.check_all()
if check_result == 1:
showinfo("系統(tǒng)消息","學(xué)號不符合要求,【要求:95開頭的6位數(shù)字】")
elif check_result == 2:
showinfo("系統(tǒng)消息","姓名不符合要求,【要求:2-10個漢字】")
elif check_result == 3:
showinfo("系統(tǒng)消息","性別不符合要求,【要求:只能填男或者女】")
elif check_result == 4:
showinfo("系統(tǒng)消息","手機號碼不符合要求,【要求:手機號碼規(guī)范】")
elif check_result == 5:
showinfo("系統(tǒng)消息","郵箱地址不符合要求,【要求:郵箱規(guī)范要求】")
elif check_result == 0:
showinfo("系統(tǒng)消息", "添加成功!")
class Student():
def __init__(self,sno:str,name:str,gender:str,mobile:str,email:str):
self.sno = sno
self.name = name
self.gender = gender
self.mobile = mobile
self.email = email
def check_sno(self): # 校驗學(xué)號
pattern = re.compile(R"^95\d{4}$")
match_result = pattern.match(self.sno)
if match_result is None:
return False
else:
return True
def check_name(self): # 校驗姓名
if len(self.name.strip())>=2 and len(self.name.strip())<=10:
# 校驗每一個字符是否都是漢字
for index in range(len(self.name.strip())):
if self.name[index] <= "\u4E00" or self.name[index] >= "\u9FA5":
return False
# 校驗到最后一個漢字仍然在編碼范圍內(nèi)
if index == len(self.name.strip())-1:
return True
else:
return False
def check_gender(self): # 校驗性別
if self.gender.strip() in ["男","女"]:
return True
else:
return False
def check_mobile(self): # 校驗手機號碼
pattern = re.compile(R"^[1][35789]\d{9}$")
match_result = pattern.match(self.mobile)
if match_result is None:
return False
else:
return True
def check_email(self): # 校驗郵箱
pattern = re.compile(R"\w{1,}[@]\w{1,}[.]\w{1,}")
match_result = pattern.match(self.email)
if match_result is None:
return False
else:
return True
def check_all(self): # 總體校驗
if not self.check_sno(): # 學(xué)號不符合
return 1
elif not self.check_name(): # 姓名不符合
return 2
elif not self.check_gender(): # 性別不符合
return 3
elif not self.check_mobile(): # 手機號碼不符合
return 4
elif not self.check_email(): # 郵箱不符合
return 5
else:
return 0 # 全部符合條件
if __name__ == '__main__':
add_gui = Add_Student()
add_gui.mainloop()
演示效果:

三、類方法
1. 類方法的介紹
(1)使用@classmethod關(guān)鍵字開頭
(2)類方法存儲在類空間,沒有綁定到對象上
(3)使用類名.方法名訪問
(4)類方法可以訪問類變量,但不能訪問實例變量 ;
(5)在定義類方法的時候通常使用cls指針,調(diào)用類變量通過cls.類變量來訪問
2. 類方法案例演示
和前面一樣,我們實現(xiàn)一個添加學(xué)生信息的窗體,不過這次我們使用類方法來實現(xiàn)。
我們創(chuàng)建一個類(含類方法的類)
class Student01():
sno = "" # 類變量
name = ""
gender = ""
mobile = ""
email = ""
def __init__(self,sno,name,gender,mobile,email):
Student01.sno = sno
Student01.name = name
Student01.gender = gender
Student01.mobile = mobile
Student01.email = email
@classmethod
def check_sno(cls): # 校驗學(xué)號
pattern = re.compile(R"^95\d{4}$")
match_result = pattern.match(cls.sno.strip())
if match_result is None:
return False
else:
return True
@classmethod
def check_name(cls): # 校驗姓名
if len(cls.name.strip())>=2 and len(cls.name.strip())<=10:
# 校驗每一個字符是否都是漢字
for index in range(len(cls.name.strip())):
if cls.name[index] <= "\u4E00" or cls.name[index] >= "\u9FA5":
return False
# 校驗到最后一個漢字仍然在編碼范圍內(nèi)
if index == len(cls.name.strip())-1:
return True
else:
return False
@classmethod
def check_gender(cls): # 校驗性別
if cls.gender.strip() in ["男","女"]:
return True
else:
return False
@classmethod
def check_mobile(cls): # 校驗手機號碼
pattern = re.compile(R"^[1][35789]\d{9}$")
match_result = pattern.match(cls.mobile)
if match_result is None:
return False
else:
return True
@classmethod
def check_email(cls): # 校驗郵箱
pattern = re.compile(R"\w{1,}[@]\w{1,}[.]\w{1,}")
match_result = pattern.match(cls.email)
if match_result is None:
return False
else:
return True
@classmethod
def check_all(cls): # 總體校驗
if not cls.check_sno(): # 學(xué)號不符合
return 1
elif not cls.check_name(): # 姓名不符合
return 2
elif not cls.check_gender(): # 性別不符合
return 3
elif not cls.check_mobile(): # 手機號碼不符合
return 4
elif not cls.check_email(): # 郵箱不符合
return 5
else:
return 0 # 全部符合條件
注意:與實例方法的類不同的是,類方法的方法名前加上關(guān)鍵字@classmethod,并且使用cls指針,指向當(dāng)前這個類。
定義好了使用類方法的類后,在GUI類中調(diào)用時,通過類名.方法名調(diào)用.
四、靜態(tài)方法
1. 靜態(tài)方法的介紹
(1)使用@staticmethod關(guān)鍵字開頭;
(2)靜態(tài)方法存儲在類空間,既沒有綁定到成員變量也沒有綁定到類;
(3)使用類名.方法名訪問
(4)靜態(tài)方法不能訪問到類中的類變量和實例變量,(self、cls這兩個關(guān)鍵字都不可使用)
(5)使用靜態(tài)方法不需要實例化,就相當(dāng)于是一個工具,拿來即用。
2. 靜態(tài)方法案例
同樣我們還是以前面搭建添加學(xué)生信息窗體為案例,使用靜態(tài)方法來實現(xiàn):
from tkinter import *
from tkinter.ttk import *
from tkinter.messagebox import *
import re
class Add_Student(Tk):
def __init__(self):
super().__init__()
self.title("添加學(xué)生")
self.resizable(0,0)
self.geometry("420x350+350+150")
self["bg"] = "whitesmoke"
self.setup_UI()
def setup_UI(self):
self.style01 = Style()
self.style01.configure("TLabel",font=("微軟雅黑",20,"bold"))
self.style01.configure("TButton", font=("微軟雅黑", 20, "bold"))
self.Label_sno = Label(self,text="學(xué)號:")
self.Label_sno.place(x=80,y=20)
self.var_sno = StringVar()
self.Entry_sno = Entry(self,textvariable = self.var_sno,width=10,font=("微軟雅黑",20,"bold"))
self.Entry_sno.place(x=150,y=20)
self.Label_name = Label(self, text="姓名:")
self.Label_name.place(x=80, y=70)
self.var_name = StringVar()
self.Entry_name = Entry(self,textvariable = self.var_name,width=10, font=("微軟雅黑", 20, "bold"))
self.Entry_name.place(x=150,y=70)
self.Label_gender = Label(self, text="性別:")
self.Label_gender.place(x=80, y=120)
self.var_gender = StringVar()
self.Entry_gender = Entry(self,textvariable = self.var_gender, width=10, font=("微軟雅黑", 20, "bold"))
self.Entry_gender.place(x=150, y=120)
self.Label_mobile = Label(self, text="手機:")
self.Label_mobile.place(x=80, y=170)
self.var_mobile = StringVar()
self.Entry_mobile = Entry(self,textvariable = self.var_mobile,width=15, font=("微軟雅黑", 20, "bold"))
self.Entry_mobile.place(x=150, y=170)
self.Label_email = Label(self, text="郵箱:")
self.Label_email.place(x=80, y=220)
self.var_email = StringVar()
self.Entry_email = Entry(self,textvariable = self.var_email, width=15, font=("微軟雅黑", 20, "bold"))
self.Entry_email.place(x=150, y=220)
self.Button_submit = Button(self,text = "提交",command = self.check_input)
self.Button_submit.place(x = 280,y=290)
def check_input(self):
# 獲取輸入的值
sno = self.var_sno.get()
name = self.var_name.get()
gender = self.var_gender.get()
mobile = self.var_mobile.get()
email = self.var_email.get()
if not Student02.check_sno(sno):
showinfo("系統(tǒng)消息", "學(xué)號不符合要求,【要求:95開頭的6位數(shù)字】")
elif not Student02.check_name(name):
showinfo("系統(tǒng)消息", "姓名不符合要求,【要求:2-10個漢字】")
elif not Student02.check_gender(gender):
showinfo("系統(tǒng)消息", "性別不符合要求,【要求:只能填男或者女】")
elif not Student02.check_gender(mobile):
showinfo("系統(tǒng)消息","手機號碼不符合要求,【要求:手機號碼規(guī)范】")
elif not Student02.check_email(email):
showinfo("系統(tǒng)消息", "郵箱地址不符合要求,【要求:郵箱規(guī)范要求】")
else:
showinfo("系統(tǒng)消息", "添加成功!")
# 使用靜態(tài)方法
class Student02():
@staticmethod
def check_sno(sno): # 校驗學(xué)號
pattern = re.compile(R"^95\d{4}$")
match_result = pattern.match(sno.strip())
if match_result is None:
return False
else:
return True
@staticmethod
def check_name(name): # 校驗姓名
if len(name.strip())>=2 and len(name.strip())<=10:
# 校驗每一個字符是否都是漢字
for index in range(len(name.strip())):
if name[index] <= "\u4E00" or name[index] >= "\u9FA5":
return False
# 校驗到最后一個漢字仍然在編碼范圍內(nèi)
if index == len(name.strip())-1:
return True
else:
return False
@staticmethod
def check_gender(gender): # 校驗性別
if gender.strip() in ["男","女"]:
return True
else:
return False
@staticmethod
def check_mobile(mobile): # 校驗手機號碼
pattern = re.compile(R"^[1][35789]\d{9}$")
match_result = pattern.match(mobile)
if match_result is None:
return False
else:
return True
@staticmethod
def check_email(email): # 校驗郵箱
pattern = re.compile(R"\w{1,}[@]\w{1,}[.]\w{1,}")
match_result = pattern.match(email)
if match_result is None:
return False
else:
return True
if __name__ == '__main__':
add_gui = Add_Student()
add_gui.mainloop()
使用靜態(tài)方法時就不用self、cls指針關(guān)鍵字了,在類中定義什么方法就接收什么參數(shù)。在GUI中調(diào)用時,也不需要實例化,直接通過類名.方法名來調(diào)用即可。
五、總結(jié)
以上,我們對于一個具體案例,通過三種不同的方法實現(xiàn)出來了。
很多時候同樣一個需求,使用實例方法、類方法、靜態(tài)方法都可以實現(xiàn)。三種方法都要熟練的掌握,并應(yīng)用在實際的開發(fā)過程中。