基于Python 函数和方法的区别说明
简单总结:
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)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
最新评论