方法的概念
??概念:描述一个目标的行为动作。面向对象中我们知道主要包含属性和方法,方法就好比描述一个人怎么吃,怎么喝,怎么玩···· ??注意:与函数非常相似,但一个类里面会封装一系列动作,他和函数都可以被调用,执行一系列动作,但与函数的区别是调用方式不同,函数写了直接调用,而方法需要先有一个实例化对象,在对象下再调用该方法。 ??函数调用方式:
def function():
print(1)
function() #直接调用
??方法调用方式:
class cat:
def function(self):
print(1)
p = cat() #先实例化一个对象
p.function() #在对象下调用方法
几种方法
??根据方法的第一个参数必须要接受的数据类型将方法划分为以下几种:
- 实例方法:默认第一个参数需要接收到一个实例
- 类方法:默认第一个参数必须接收到一个类
- 静态方法:第一个参数啥都不接收
注意:不管哪种类型方法,都是储存在类中,没有在实例当中的;不同类型方法调用方式不同。
class cat:
def func1(self):
print("这是一个实例方法", self)
@classmethod
def func2(cls):
print(''这是一个类方法'', cls)
@staticmethod
def func3():
print("这是一个静态方法")
p = cat()
p.func1() #实例方法调用
cat.func2() #类方法调用,也可cat().func2()
cat.func3() #静态方法调用
类方法:
??从源码上可以看出,类方法有类和实例两种调用方式,实例调用时实例会被忽略,但它的类不会被忽略。注意写类方法时一定要加一个装饰器@classmethod,我们知道装饰器的作用是在保证原本函数不改变的前提下,直接给这个函数添加一些功能。源码中第三行指出该装饰器目的是将一个函数转化为一个类方法。
静态方法
??其源码自己去看,这里不再细述。但注意也是两种调用方式。
不同方法使用场景
实例方法
??关于方法的选择,要根据不同的问题,自己决定,到底该设计怎样的方法来解决问题。举个小例子,对于一个列表,我们需要对其进行排序操作,我们有以下几种方法:
l = [1, 4, 3, 2]
sorted(l) #方法一,直接使用函数
list.sort(l) #方法二,使用类方法,假设list是一个类,sort()是list类的一个类方法
l.sort() #方法三,使用实例方法
通过比较,发现使用实例方法是最简洁的,因为自动传入了实例这个对象,而类方法需要用类来调用,然后还需要传入实例对象,这样就多了一个参数,故而这种情况下选择实例方法最合适。
类方法
??当我们在实现方法时需要用到类本身时,就要将其设计为类方法。
静态方法
??既不需要在实现时使用实例本身,也不需要使用类,就没必要传递实例和类,所以选用静态方法就更方便了。
|