Python中函数与方法的核心区别及常见内置方法详解
本文深入解析Python中函数(Function)与方法(Method)的本质区别,重点阐述参数传递机制(显式与隐式self/cls)、定义位置及调用方式的差异。同时详细对比实例方法、静态方法与类方法的语法特征及应用场景,并汇总字符串处理、列表操作及类型转换等常用内置方法的用法与注意事项。
核心要点概括:
1. 未绑定到类或实例的Function统称为函数;
2. 绑定到类或实例的Function统称为方法。
首先需要纠正一个常见误区:并非定义在类内部的调用都自动被视为方法。
函数(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)需手动传递。
需要注意的是,这种区分仅在Python 3中明确存在,在Python 2中所有此类调用均被称为方法。
最大的区别在于参数传递方式:方法自动传递参数self,而函数需要主动传递参数。
因此,我们可以通过观察参数是如何传递的来判断其类型;
如果仍不确定,可以打印其类型进行确认。
from types import FunctionType,MethodType
print(isinstance(obj.func,MethodType)) ---># True
print(isinstance(Foo.func,FunctionType)) ---># True
表面区别:
区别一:所处位置。函数直接编写在文件中(模块层级),而方法必须编写在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类语法中包含三种方法:实例方法、静态方法、类方法。
注: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)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













