Python函式的正確用法及其注意事項
簡單總結:
- 與類和例項無繫結關係的function都屬於函式(function);
- 與類和例項有繫結關係的function都屬於方法(method)。
首先摒棄錯誤認知:並不是類中的呼叫都叫方法
函式(FunctionType)
函式是封裝了一些獨立的功能,可以直接呼叫,能將一些資料(引數)傳遞進去進行處理,然後返回一些資料(返回值),也可以沒有返回值。可以直接在模組中進行定義使用。 所有傳遞給函式的資料都是顯式傳遞的。
方法(MethodType)
方法和函式類似,同樣封裝了獨立的功能,但是方法是隻能依靠類或者物件來呼叫的,表示針對性的操作。
方法中的資料self和cls是隱式傳遞的,即方法的呼叫者;
方法可以操作類內部的資料
簡單的說,函式在python中獨立存在,可直接使用的,而方法是必須被別人呼叫才能實現的。
靜態方法除外(與類和物件均無關,通過類名和物件名均可被呼叫,屬函式)
在模組中實現的函式只要匯入這個模組的這個函式既可以任意使用了,但是在類中宣告的必須匯入這個類之後然後再通過建立例項或者類名來呼叫。可以說直接在模組中宣告的是更普遍廣泛性的函式,而在類中宣告的方法一般是專屬於一類事物特有的
from types import MethodType,FunctionType class Foo(object): def __init__(self): self.name="haiyan" def func(self): print(self.name) obj = Foo() print(isinstance(obj.func,FunctionType)) #False print(isinstance(obj.func,MethodType)) #True #說明這是一個方法 print(isinstance(Foo.func,FunctionType)) #True #說明這是一個函式。 print(isinstance(Foo.func,MethodType)) #False
是的!例子中很明確,類物件呼叫func是方法,類呼叫func是函式,並且是自己傳遞引數123!
注意,這只是在 python3 中才有的區分,python2 中全部稱為方法。
最大的區別是引數的傳遞引數,方法是自動傳參self,函式是主動傳參
那麼以後我們就可以直接看引數是如何傳遞的來判斷,
如果還不確定可以列印型別看看
from types import FunctionType,MethodType print(isinstance(obj.func,MethodType)) ---># True print(isinstance(Foo.func,FunctionType)) ---># True
表面區別:
區別一所處的位置:函式是直接寫檔案中而不是class中,方法是隻能寫在class中。
區別二定義的方式:
1.函式定義的方式 def關鍵字 然後接函式名 再是括號 括號裡面寫形參也可以省略不寫形參
def functionName():
"""這裡是函式的註釋"""
print("這一塊寫函式的內容"
2.方法定義的方式 首先方法是定義在類中的其他他大體和函式定義差不多,這裡需要注意的一點就是方法必須帶一個預設引數(相當於this),靜態方法除外
class className(super):
def methodName(self):
"""這裡是方法的註釋
self相當於this;
"""
print("這裡是方法的內容")
區別三呼叫的方式:
1.函式的呼叫:函式的呼叫是直接寫 函式名(函式引數1,函式引數2,......)
def functionName():
print("這是一個函式")
#呼叫
functionName()
2.方法的呼叫:方法是通過物件點方法呼叫的(這裡是指物件方法)
class className:
def method(self):
print("這是一個方法")
#Python學習交流群:531509025
#呼叫---------------------
#例項化物件
c=className()
c.method()
python類的例項方法、靜態方法和類方法區別及其應用場景
一、先看語法,python 類語法中有三種方法,例項方法,靜態方法,類方法。
ps.python中self,cls的區別
普通例項方法,第一個引數需要是self,它表示一個具體的例項本身。
如果用了staticmethod,那麼就可以無視這個self,而將這個方法當成一個普通的函式使用。
而對於classmethod,它的第一個引數不是self,是cls,它表示這個類本身。
class Foo(object):
"""類三種方法語法形式"""
def instance_method(self):
print("是類{}的例項方法,只能被例項物件呼叫".format(Foo))
@staticmethod
def static_method():
print("是靜態方法")
@classmethod
def class_method(cls):
print("是類方法")
foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print('----------------')
Foo.static_method()
Foo.class_method()
執行結果如下
是類<class '__main__.Foo'>的例項方法,只能被例項物件呼叫
是靜態方法
是類方法
----------------
是靜態方法
是類方法
說明:
例項方法只能被例項物件呼叫,靜態方法(由@staticmethod裝飾的方法)、類方法(由@classmethod裝飾的方法),可以被類或類的例項物件呼叫。
-
例項方法,第一個引數必須要預設傳例項物件,一般習慣用self。
靜態方法,引數沒有要求。 -
類方法,第一個引數必須要預設傳類,一般習慣用cls。