1. 程式人生 > >Python-例項方法靜態方法類方法對比總結(附Python程式碼)

Python-例項方法靜態方法類方法對比總結(附Python程式碼)

相關概念

1:例項方法

除了靜態方法與類方法外,類的其他方法都屬於例項方法。

例項方法隱含的引數為類例項self。

例項方法需要將類例項化後才可以呼叫,如果使用類直接呼叫例項方法,需要顯示地將例項物件作為引數傳入。

**直接用類呼叫例項方法程式碼**:
class ClassA():

    def funcA(self):
        print('Hello world')

# 使用例項呼叫例項方法
    c = ClassA()
#     ca.funcA()    -----類例項化後,呼叫例項方法,輸出結果為Hello world

# 如果使用類直接呼叫例項方法,需要顯式地將例項作為引數傳入
ClassA.funcA(c) ----類直接呼叫,需要顯示地將例項物件作為引數傳入,輸出結果為Hello world

2:靜態方法

靜態方法是類中的函式,不需要例項。靜態方法主要是用來存放邏輯性的程式碼,主要是一些邏輯屬於類,但是和類本身沒有互動,即在靜態方法中,不會涉及到類中的方法和屬性的操作。可以理解為將靜態方法存在此類的名稱空間中。事實上,在python引入靜態方法之前,通常是在全域性名稱空間中建立函式。

靜態方法可以被類或例項物件訪問

**靜態方法程式碼:**
import time
class TimeTest(object):
    def
__init__(self,hour,minute,second): self.hour = hour self.minute = minute self.second = second @staticmethod def showTime(): return time.strftime("%H:%M:%S", time.localtime()) #t = TimeTest(2,10,10) #nowTime = t.showTime() --- 例項物件呼叫靜態方法 #輸出為:23:08:13
# print (TimeTest.showTime()) ----類直接呼叫靜態方法 #輸出為23:08:13

備註:

Python使用靜態方法類似函式工具使用,一般儘量少用靜態方法。

Python的靜態方法和類成員方法都可以被類或例項訪問,兩者概念不容易理清,但還是有區別的:

1)靜態方法無需傳入self引數,類成員方法需傳入代表本類的cls引數;

2)從第1條,靜態方法是無法訪問例項變數的,而類成員方法也同樣無法訪問例項變數,但可以訪問類變數;

3)靜態方法有點像函式工具庫的作用,而類成員方法則更接近類似Java面向物件概念中的靜態方法。

3:類方法

類方法可以通過類直接呼叫,或通過例項直接呼叫。但無論哪種呼叫方式,方法隱含的引數為類本身cls

**類方法程式碼:**
class Student(object):
    school='szu'

    @staticmethod
    def printmassage(a):
        print(a)
        
s1=Student()
Student.printmassage('school') ---類直接呼叫 輸出為szu
s1.printmassage('school'----例項物件直接呼叫,輸出為szu    

例項方法和類方法區別:

首先形式上的區別,例項方法隱含的引數為類例項self,而類方法隱含的引數為類本身cls。 靜態方法無隱含引數,主要為了類例項也可以直接呼叫靜態方法。

所以邏輯上,類方法被類呼叫,例項方法被例項呼叫,靜態方法兩者都能呼叫。主要區別在於引數傳遞上的區別,例項方法悄悄傳遞的是self引用作為引數,而類方法悄悄傳遞的是cls引用作為引數。

4:總結-程式碼

下面我們在同一個程式中使用例項方法,類方法,靜態方法,對比輸出結果。

#定義一個類,包含以上三種方法
class A:
    #類屬性
    explanation = 'this is my programs'
    #普通方法,或例項方法
    def normalMethod(self,name):
        print(self.explanation)
    #類方法,可以訪問類屬性
    @classmethod
    def classMethod(cls,explanation):
        print(cls.explanation)
    #靜態方法。不可以訪問類屬性
    @staticmethod
    def staticMethod(explanation):
        print(explanation)
        
a = A()     #a 是例項物件
a.explanation = 'this is new'

# print(a.normalMethod('explanation'))  #例項呼叫例項方法,所以結果為 this is new,例項物件可以修改類的屬性
# print(A.normalMethod('explanation'))   # 類不能呼叫例項方法

# print(a.classMethod('explanation'))  #類方法可由例項物件或者類呼叫,因為傳入了cls引數,
# print(A.classMethod('explanation'))   #兩者輸出結果都是this is my programs

# print(a.staticMethod('my'))  # 靜態方法兩者都可以訪問,直接輸出傳入方法的值
# print(A.staticMethod('explanation'))  # 兩者輸出結果都是 explanation

首先來看例項方法:

print(a.normalMethod('explanation')) #輸出結果為:this is new,因為例項物件重新賦予了類的屬性

類方法訪問例項方法時,會報錯

print(A.normalMethod('explanation'))  ##報錯,因為類不能呼叫例項方法

總結:所以例項方法(普通方法)應該由例項呼叫,類不能呼叫

再來看類方法:

print(a.classMethod('explanation'))  #輸出結果this is my programs
print(A.classMethod('explanation'))   #輸出結果this is my programs

注意這裡的輸出結果是:this is my programs,例項方法輸出的結果是:this is new,類中定義的屬性explanation=’this is my programs‘,與例項化修改後的a.explanation = 'this is new’結果無關

總結:類方法可以由類呼叫,而且因為傳入了引數cls,故也可以由例項來呼叫

最後來看靜態方法:

print(a.staticMethod('testing coding one'))  # 輸出testing coding one
print(A.staticMethod('testing coding two'))  # 輸出testing coding two

總結:靜態方法可以被例項物件和類訪問,直接輸出傳入方法的值

歸納成一張表:

例項方法(普通方法) 類方法 靜態方法
例項呼叫a=A() a.normalMethod(x) a.classMethod(x) a.staticMethod(x)
類呼叫A 不能呼叫 A.classMethod(x) A.staticMethod(x)

所以例項方法的許可權是最高的,只有例項物件可以訪問。

而靜態方法,例項物件和類方法都可以訪問。