Python-例項方法靜態方法類方法對比總結(附Python程式碼)
阿新 • • 發佈:2018-12-16
相關概念
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) |
所以例項方法的許可權是最高的,只有例項物件可以訪問。
而靜態方法,例項物件和類方法都可以訪問。