一、实例方法和自动绑定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