Python中實例方法、類方法、與靜態(tài)方法的區(qū)別

一、方法總體介紹

方法:實現(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.gif

三、類方法

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ā)過程中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容