函数与方法

Posted qianslup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数与方法相关的知识,希望对你有一定的参考价值。

函数与方法

定义:

函数(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......)

 

以上是关于函数与方法的主要内容,如果未能解决你的问题,请参考以下文章

Scala 方法与函数

js构造函数的方法与原型prototype

函数与方法对比

构造函数与析构函数

Ruby 函数与方法

绑定与非绑定方法及反射,isinstance和issubclass内置函数