Python中函式和方法的區別
簡單總結:
1.與類和例項無繫結關係的function都屬於函式(function);
2.與類和例項有繫結關係的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),靜態方法除外
'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
class className(super):
def methodName(self):
"""這裡是方法的註釋
self相當於this;
"""
print("這裡是方法的內容")
區別三呼叫的方式:
1.函式的呼叫:函式的呼叫是直接寫 函式名(函式引數1,函式引數2,…)
def functionName():
print("這是一個函式")
#呼叫
functionName()
2.方法的呼叫:方法是通過物件點方法呼叫的(這裡是指物件方法)
class className:
def method(self):
print("這是一個方法")
#呼叫---------------------
#例項化物件
c=className()
c.method()
python類的例項方法、靜態方法和類方法區別及其應用場景
一、先看語法,python 類語法中有三種方法,例項方法,靜態方法,類方法。
ps.python中self,cls的區別
普通例項方法,第一個引數需要是self,它表示一個具體的例項本身。
如果用了staticmethod,那麼就可以無視這個self,而將這個方法當成一個普通的函式使用。
而對於classmethod,它的第一個引數不是self,是cls,它表示這個類本身。
# coding:utf-8
'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ群:778463939
尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視訊學習教程和PDF電子書!
'''
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。
相關文章
- python中的str和repr函式的區別Python函式
- JavaScript方法和函式區別JavaScript函式
- python函式與方法的區別總結Python函式
- strcpy函式和memcpy函式的區別函式memcpy
- StretchBlt函式和BitBlt函式的區別和用法函式
- python isinstance和issubclass,區分方法和函式,反射Python函式反射
- # 普通函式和箭頭函式的區別函式
- python語言中類和函式的作用及區別!Python函式
- python內建函式-eval()函式與exec()函式的區別Python函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- Python 函式中引數前面一個和兩個星號(**)的區別Python函式
- TypeScript 中函式的理解?與 JavaScript 函式的區別?TypeScript函式JavaScript
- 簡述箭頭函式和普通函式的區別函式
- 箭頭函式和普通函式的10個區別函式
- Python中is和==的區別Python
- Python 中 is 和 == 的區別Python
- 全網最適合入門的物件導向程式設計教程:49 Python函式方法與介面-函式與方法的區別和lamda匿名函式物件程式設計Python函式
- Day 59/100 箭頭函式和普通函式的區別函式
- 面試題:箭頭函式和普通函式的區別面試題函式
- faker 類 randomElement () 方法和 array_random () 函式區別分析。random函式
- Python3中列表方法append()和extend()的區別PythonAPP
- Python range與enumerate函式區別解析Python函式
- 例項物件和函式物件的區別物件函式
- window.onload()函式和jQuery中的document.ready()區別函式jQuery
- 深入理解箭頭函式和傳統函式的區別函式
- Python中zip函式的使用方法Python函式
- Python中類方法和例項方法有什麼區別?Python
- Java中 equals() 方法和 == 的區別Java
- 箭頭函式、簡寫函式、普通函式的區別函式
- 建構函式與普通函式的區別函式
- 箭頭函式與普通函式的區別函式
- setTimeout中的this指向問題和箭頭函式結合的區別函式
- Python中字典和json的區別!PythonJSON
- python中break和continue的區別Python
- laravel中delete()方法和destroy()方法的區別Laraveldelete
- Python列表中set函式的使用方法!Python函式
- Python中的@staticmethod和@classmethod的區別PythonSSM
- 淺談Numpy中的shape、reshape函式的區別函式