函数与方法
函数与方法
定义:
函数(FunctionType)
函数是封装了一些独立的功能,可以直接调用,能将一些数据(参数)传递进去进行处理,然后返回一些数据(返回值),也可以没有返回值。可以直接在模块中进行定义使用。 所有传递给函数的数据都是显式传递的。
方法(MethodType)
方法和函数类似,同样封装了独立的功能,但是方法是只能依靠类或者对象来调用的,表示针对性的操作;
类中的函数称为方法;
方法中的数据self和cls是隐式传递的,即方法的调用者;
方法可以操作类内部的数据。
简单的说,函数在python中独立存在,可直接使用的,而方法是必须被别人调用才能实现的。
静态方法除外(与类和对象均无关,通过类名和对象名均可被调用,属函数)
- 与类和实例无绑定关系的function都属于函数(function)
- 与类和实例有绑定关系的function都属于方法(method)
实例方法如果用类调用就会成为函数,用实例调用就是方法
from types import FunctionType,MethodType class Fm(): def ceshi(self): print('function diff menth') obj = Fm() print(isinstance(obj.ceshi,FunctionType)) #False print(isinstance(obj.ceshi,MethodType)) #True #说明这是一个方法 print(isinstance(Fm.ceshi,FunctionType)) #True #说明这是一个函数。 print(isinstance(Fm.ceshi,MethodType)) #False
方法
分类
静态方法、类方法、对象方法。
对象方法有self参数,类方法有cls参数,静态方法不需要这些附加参数。
静态方法
要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数。
使用静态方法的好处是,不需要定义实例即可使用这个方法。
另外,多个实例共享此静态方法(静态方法无法访问类属性、实例属性,相当于一个相对独立的方法,跟类其实没什么关系,简单讲,静态方法就是放在一个类的作用域里的函数而已)。
类方法
类方法与普通的成员函数和静态函数有不同之处。
定义: 一个类方法就可以通过类或它的实例来调用的方法, 不管你是用类来调用这个方法还是类实例调用这个方法,该方法的第一个参数总是定义该方法的类对象。
也即是方法的第一个参数都是类对象而不是实例对象. 按照习惯,类方法的第一个形参被命名为 cls。
任何时候定义类方法都不是必须的(类方法能实现的功能都可以通过定义一个普通函数来实现,只要这个函数接受一个类对象做为参数就可以了)。
同时,类方法可以访问类属性,无法访问实例属性。
所以使用的时候要注意,使用好的话功能很强大,使用不好容易混淆。
对象方法:先创建一个对象,在用对象去调用这个方法
静态方法:直接用类调用,可以有任意参数(静态方法可以让类直接调用,省去了普通方法创建对象的步骤)
类方法:直接用类调用,只能一个cls参数
函数
分类
- 内置函数:python内嵌的一些函数。
- 匿名函数:一行代码实现一个函数功能。
- 递归函数
- 自定义函数:根据自己的需求,来进行定义函数。
区别
定义方式不同
函数定义方式:def function_name(参1,参数2.....)
方法定义方式:def methon_name(self | cls)(静态方法除外)
静态方法可以看做特殊的函数。
定义位置不同
函数定义位置:在文件中。
方法定义位置:在Class中。
作用域不同
函数作用域:从函数调用开始至函数执行完成,返回给调用者后,在执行过程中开辟的空间会自动释放,也就是说函数执行完成后,函数体内部通过赋值等方式修改变量的值不会保留,会随着返回给调用者后,开辟的空间会自动释放。
方法作用域:通过实例化的对象进行方法的调用,调用后开辟的空间不会释放,也就是说调用方法中对变量的修改值会一直保留。
调用方式不同
函数调用方式: function_name(参数1,参数2......)
方法调用法师:object.methon(参数1,参数2......)