基于Python 函数和方法的区别说明


Posted in Python onMarch 24, 2021

简单总结:

1、与类和实例无绑定关系的function都属于函数(function);

2、与类和实例有绑定关系的function都属于方法(method)。

首先摒弃错误认知:并不是类中的调用都叫方法

函数(FunctionType)

函数是封装了一些独立的功能,可以直接调用,能将一些数据(参数)传递进去进行处理,然后返回一些数据(返回值),也可以没有返回值。可以直接在模块中进行定义使用。 所有传递给函数的数据都是显式传递的。

方法(MethodType)

方法和函数类似,同样封装了独立的功能,但是方法是只能依靠类或者对象来调用的,表示针对性的操作。

方法中的数据self和cls是隐式传递的,即方法的调用者;

方法可以操作类内部的数据

简单的说,函数在python中独立存在,可直接使用的,而方法是必须被别人调用才能实现的。

静态方法除外(与类和对象均无关,通过类名和对象名均可被调用,属函数)

在模块中实现的函数只要导入这个模块的这个函数既可以任意使用了,但是在类中声明的必须导入这个类之后然后再通过创建实例或者类名来调用。可以说直接在模块中声明的是更普遍广泛性的函数,而在类中声明的方法一般是专属于一类事物特有的

from types import MethodType,FunctionType
class Foo(object):
  def __init__(self):
   self.name="haiyan"
  def func(self):
   print(self.name)
obj = Foo()
print(isinstance(obj.func,FunctionType)) #False
print(isinstance(obj.func,MethodType)) #True #说明这是一个方法
  
print(isinstance(Foo.func,FunctionType)) #True #说明这是一个函数。
print(isinstance(Foo.func,MethodType)) #False

是的!例子中很明确,类对象调用func是方法,类调用func是函数,并且是自己传递参数123!

注意,这只是在 python3 中才有的区分,python2 中全部称为方法。

最大的区别是参数的传递参数,方法是自动传参self,函数是主动传参

那么以后我们就可以直接看参数是如何传递的来判断,

如果还不确定可以打印类型看看

from types import FunctionType,MethodType
print(isinstance(obj.func,MethodType)) ---># True
print(isinstance(Foo.func,FunctionType)) ---># True

表面区别:

区别一所处的位置:函数是直接写文件中而不是class中,方法是只能写在class中。

区别二定义的方式:

1.函数定义的方式 def关键字 然后接函数名 再是括号 括号里面写形参也可以省略不写形参

def functionName():
 """这里是函数的注释"""
 print("这一块写函数的内容"

2.方法定义的方式 首先方法是定义在类中的其他他大体和函数定义差不多,这里需要注意的一点就是方法必须带一个默认参数(相当于this),静态方法除外

class className(super):
  
 def methodName(self):
  """这里是方法的注释
  self相当于this;
  """
  print("这里是方法的内容")

区别三调用的方式:

1.函数的调用:函数的调用是直接写 函数名(函数参数1,函数参数2,......)

def functionName():
 print("这是一个函数")
  
#调用
functionName()

2.方法的调用:方法是通过对象点方法调用的(这里是指对象方法)

class className:
  
 def method(self):
  print("这是一个方法")
  
#调用---------------------
#实例化对象
c=className()
  
c.method()

python类的实例方法、静态方法和类方法区别及其应用场景

一、先看语法,python 类语法中有三种方法,实例方法,静态方法,类方法。

ps.python中self,cls的区别

普通实例方法,第一个参数需要是self,它表示一个具体的实例本身。

如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。

而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身。

# coding:utf-8
class Foo(object):
 """类三种方法语法形式"""
  
 def instance_method(self):
  print("是类{}的实例方法,只能被实例对象调用".format(Foo))
  
 @staticmethod
 def static_method():
  print("是静态方法")
  
 @classmethod
 def class_method(cls):
  print("是类方法")
  
foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print('----------------')
Foo.static_method()
Foo.class_method()

运行结果如下

是类<class '__main__.Foo'>的实例方法,只能被实例对象调用

是静态方法

是类方法

----------------

是静态方法

是类方法

说明:

实例方法只能被实例对象调用,静态方法(由@staticmethod装饰的方法)、类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用。

实例方法,第一个参数必须要默认传实例对象,一般习惯用self。

静态方法,参数没有要求。

类方法,第一个参数必须要默认传类,一般习惯用cls。

补充:python方法和函数集锦

方法的使用: 变量.方法名(参数)

函数的使用: 函数名(参数)

字符串

1、删除空白

rstrip(): 返回去掉尾部的空格后的字符串。(不改变原字符串)

lstrip(): 去掉首部空格

strip(): 去掉两端的空格

2、修改字符串大小写

title(): 以首字母大写的方式显示每个单词

upper(): 将字符串转换为全部大写

lower(): 将字符串转换为全部小写

name = "ada lovelace"
 

print(name.title())
# => Ada Lovelace
  
print(name.upper())
# => ADA LOVELACE
  
print(name.lower())
# => ada lovelace

数字、浮点数

1、类型转换

str():将数字类型用作字符串

列表

1、添加元素

append(): 在列表末尾添加元素 insert(index, value): 在列表索引位置添加新元素

2、删除元素

del语句

pop(): 删除列表末尾元素

pop(index): 删除指定索引位置的元素

remove(value): 删除指定值的元素(第一次出现值)

3、排序

列举的方法只适用于所有元素都是小写字母的列表,如果是大写字母和小写字母混合的情况,因为解读大写字母的方式有多种,所以需要进一步指定准确的排列方法才行。

(1) 永久性修改

sort(): 按列表元素首字母排序。(直接修改原列表)

sort(reverse = True): 按列表元素首字母倒序排序。

使用:arr.sort()

(2) 临时排序(返回排序后的列表,不改变原列表)

sorted():按列表元素首字母排序。 sorted(arr, reverse = True): 按列表元素首字母倒序排序使用:sorted(arr)

4、倒着打印列表

reverse()

反转列表元素的顺序,但并不进行排序处理。永久性修改列表元素的排列顺序。但是可再次使用reverse()方法反转恢复

5、确定列表的长度

len(arr)

Python 相关文章推荐
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
Pytorch之扩充tensor的操作
Mar 04 #Python
快速一键生成Python爬虫请求头
Mar 04 #Python
10个顶级Python实用库推荐
Mar 04 #Python
pytorch 把图片数据转化成tensor的操作
Mar 04 #Python
pytorch 计算Parameter和FLOP的操作
Mar 04 #Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 #Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 #Python
You might like
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
php验证session无效的解决方法
2014/11/04 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
JavaScript 事件对象的实现
2009/07/13 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
Python实现多属性排序的方法
2018/12/05 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
wxpython绘制圆角窗体
2019/11/18 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
建筑学推荐信
2013/11/03 职场文书
重阳节活动总结
2014/08/27 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
小学德育工作总结2015
2015/05/12 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis