首頁 > 軟體

基於Python 函數和方法的區別說明

2021-03-19 19:09:07

簡單總結:

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),靜態方法除外

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
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方法和函數集錦

方法的使用: 變數.方法名(引數)

函數的使用: 函數名(引數)

字串

1、刪除空白

rstrip(): 返回去掉尾部的空格後的字串。(不改變原字串)

lstrip(): 去掉首部空格

strip(): 去掉兩端的空格

2、修改字串大小寫

title(): 以首字母大寫的方式顯示每個單詞

upper(): 將字串轉換為全部大寫

lower(): 將字串轉換為全部小寫

name = "ada lovelace"

 


print(name.title())
# => Ada Lovelace
 
print(name.upper())
# => ADA LOVELACE
 
print(name.lower())
# => ada lovelace

數位、浮點數

1、型別轉換

str():將數位型別用作字串

列表

1、新增元素

append(): 在列表末尾新增元素 insert(index, value): 在列表索引位置新增新元素

2、刪除元素

del語句

pop(): 刪除列表末尾元素

pop(index): 刪除指定索引位置的元素

remove(value): 刪除指定值的元素(第一次出現值)

3、排序

列舉的方法只適用於所有元素都是小寫字母的列表,如果是大寫字母和小寫字母混合的情況,因為解讀大寫字母的方式有多種,所以需要進一步指定準確的排列方法才行。

(1) 永久性修改

sort(): 按列表元素首字母排序。(直接修改原列表)

sort(reverse = True): 按列表元素首字母倒序排序。

使用:arr.sort()

(2) 臨時排序(返回排序後的列表,不改變原列表)

sorted():按列表元素首字母排序。 sorted(arr, reverse = True): 按列表元素首字母倒序排序使用:sorted(arr)

4、倒著列印列表

reverse()

反轉列表元素的順序,但並不進行排序處理。永久性修改列表元素的排列順序。但是可再次使用reverse()方法反轉恢復

5、確定列表的長度

len(arr)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。如有錯誤或未考慮完全的地方,望不吝賜教。


IT145.com E-mail:sddin#qq.com