一、實例方法和自動綁定self 在類中定義的實例方法,Python會自動綁定方法的第一個參數(通常是self,下文也預設為self),第一個參數總會指向調用該方法的對象,因為實例方法(包括構造方法)第一個self參數會自動綁定,所以調用普通方法和實例方法時不需要為第一個參數傳值(方法第一個參數代表的 ...
一、實例方法和自動綁定self
在類中定義的實例方法,Python會自動綁定方法的第一個參數(通常是self,下文也預設為self),第一個參數總會指向調用該方法的對象,因為實例方法(包括構造方法)第一個self參數會自動綁定,所以調用普通方法和實例方法時不需要為第一個參數傳值(方法第一個參數代表的對象是不確定的,只有這個方法被調用,它代表的對象才會被確定下來)。
- self在構造函數中引用,表示該構造方法正在初始化的對象。
- self在普通實例方法中引用,表示調用該方法的對象。
例:
class a: def __init__(self): k1 = 1 # 在構造方法中定義k1局部變數 print ('k1的值:',k1) self.k1 = 2 # self代表構造方法正在初始化的對象的k1實例變數變為2 print ('k1初始化後的值:',self.k1) def b(self): print ('執行b方法') def c(self): self.b() # 使用self參數引用調用c()方法的對象,不加self將會報錯NameError: name 'b' is not defined print ('執行c方法') A = a() ''' 構造函數執行了一遍,列印 k1的值: 1 k1初始化後的值: 2 ''' A.c() ''' 執行b方法 執行c方法 '''
如果在方法中把self參數作為返回值,則可以連續多次調用同一個方法,例:
class p: def y(self): print ('執行y方法') return self P = p() P.y().y().y().y() ''' 列印 執行y方法 執行y方法 執行y方法 執行y方法 <__main__.p object at 0x0000000002EAAC50> '''
二、函數和方法的區別
調用類的方法可以以函數的方式執行它或者以方法調用,區別如下:
- 函數:直接使用類名.實例名調用,需要手動傳self。
- 方法:如果是一個函數,使用函數名調用,如果是一個方法,使用對象.實例名調用,不需要手動傳self。
例:
class a: def __init__(self): k1 = 1 print ('k1的值:',k1) self.k1 = 2 print ('k1初始化後的值:',self.k1) def b(self): print ('執行b方法') def c(self): self.b() print ('執行c方法') # 實例化 A = a() A.c() # 方法 a.c(A) # 函數,需要手動傳self # 可以使用ininstance()函數判斷是函數還是方法 from types import FunctionType,MethodType print (isinstance(A.c,MethodType)) # 列印 True print (isinstance(A.c,FunctionType)) # 列印 False print (isinstance(a.c,MethodType)) # 列印 False print (isinstance(a.c,FunctionType)) # 列印 True