Python函数(function)与方法(method)区别

本文通过示例代码详细解释了在Python中函数与方法的区别。在类外部定义的可执行单元被视为函数,在类内部定义并与特定实例绑定的为方法。此外还介绍了静态方法和类方法的特点。
该文章已生成可运行项目,

一直以来都以为函数和方法是一个东西,平时区分也不是很详细,后来一搜索发现自己平时叫法是错的。

先看一段代码

def fun():
    pass
print fun

结果如下:

<function fun at 0x00000000022BC3C8>

可以看出:
单独定义的一个function是function,它是一个函数。我个人的理解是,在class外部定义的可执行函数,都是函数。

再看另外一段代码

#  coding:utf-8


class Apple:

    def fun1(self):
        return 'normal'

    @staticmethod
    def fun2():

        return 'staticmethod'

    @classmethod
    def fun3(cls):

        return 'classmethod'


print Apple.fun1
print Apple.fun2
print Apple.fun3

print "-"*80

apple = Apple()
print apple.fun1
print apple.fun2
print apple.fun3

结果如下:

<unbound method Apple.fun1>
<function fun2 at 0x00000000021DC4A8>
<bound method classobj.fun3 of <class __main__.Apple at 0x0000000001D8C768>>
-------------------------------------------------------------------------------------
<bound method Apple.fun1 of <__main__.Apple instance at 0x00000000021DAE08>>
<function fun2 at 0x00000000021DC4A8>
<bound method classobj.fun3 of <class __main__.Apple at 0x0000000001D8C768>>

可以看出:

  • 在class内定义的普通方法,如fun1,因为它是要面向将来实例化对象的,其实它就是一个实例方法。它属于method,是一个方法。
  • 在class内定义的静态方法,如fun2,它与任何对象都没有联系,等同于是在class外定义的function,它属于函数。
  • 在class内定义的类方法,如fun3,它第一个参数必须是cls,它与class本身是绑定关系,它属于方法。

简单总结:

  1. 与类和实例无绑定关系的function都属于函数(function);
  2. 与类和实例有绑定关系的function都属于方法(method)。

谢谢,不对之处还请指正。

本文章已经生成可运行项目
<think>嗯,用户想了解Python函数方法区别,这需要仔细梳理两者的定义和用法。首先,我需要回忆一下函数方法的基本概念。函数应该是一段可重用的代码,而方法则是对象关联的函数,属于类的成员。可能需要从定义方式、调用方式、作用域等方面来区分。 记得函数是独立定义的,可以通过函数名直接调用,而方法必须通过类的实例或类本身来调用。比如,字符串的upper()方法,需要像s.upper()这样调用。另外,方法的第一个参数通常是self,指向实例本身,而函数不需要这个。 还有,方法可以分为实例方法、类方法和静态方法,它们的区别在于参数和装饰器的不同。实例方法需要self,类方法用@classmethod装饰,参数是cls,静态方法用@staticmethod装饰,不需要默认参数。而函数则没有这些分类。 用户可能还关心两者的联系,比如方法本质上也是函数,只是绑定在类或实例上。可以使用types模块中的MethodType和FunctionType来判断类型差异。此外,函数可以赋值给变量,方法也可以,但调用时需要绑定实例。 需要确保回答结构清晰,分点说明区别和联系,并给出代码示例。比如展示函数方法的定义调用,不同类型方法的例子,以及类型检查的方法。最后生成相关问题,帮助用户深入理解,比如作用域、装饰器的影响等。 检查是否有遗漏点,比如内置函数和内置方法区别,或者是否提到类方法和静态方法的不同。确保引用正确的示例代码,比如用户提供的函数指针和format函数用法,但当前问题不直接相关,可能不需要涉及。不过可以提到函数作为对象被传递,类似于方法绑定。 最后确认使用中文,数学公式用$...$,独立公式用$$...$$,但这个问题可能不太涉及数学内容。保持回答符合用户指令中的格式要求,分点明确,代码块正确,相关引用标识添加在适当位置,但用户提供的引用可能不相关,需注意是否需要调整。根据用户提供的引用,可能不需要直接引用,但如果有相关的内部引用可以添加,但这里可能不需要。因此,最终回答应集中在函数方法区别,结构清晰,示例正确,相关问题合理。</think>### Python函数方法区别及联系 #### 1. **定义作用域** - **函数Function)**:独立定义的代码块,通过`def`关键字声明,**不依赖特定对象或类**。例如: ```python def add(a, b): return a + b ``` - **方法Method)**:类或对象绑定的函数,定义在类内部。例如: ```python class Calculator: def multiply(self, a, b): # 实例方法 return a * b ``` #### 2. **调用方式** - **函数调用**:直接通过函数名调用,无需绑定对象: ```python result = add(2, 3) # 输出5 ``` - **方法调用**:必须通过类或实例调用: ```python calc = Calculator() result = calc.multiply(2, 3) # 输出6 ``` #### 3. **参数传递** - 函数参数:普通参数,无需隐含对象。 - 方法参数: - **实例方法**:第一个参数为`self`(指向实例自身)。 - **类方法**:使用`@classmethod`装饰器,第一个参数为`cls`(指向类本身)。 - **静态方法**:使用`@staticmethod`装饰器,无默认参数。 ```python class MyClass: @classmethod def class_method(cls): print("类方法") @staticmethod def static_method(): print("静态方法") ``` #### 4. **本质联系** - 方法本质上是**绑定到类或对象的函数**。例如: ```python print(type(Calculator.multiply)) # 输出<class 'function'>(未绑定) print(type(calc.multiply)) # 输出<class 'method'>(已绑定实例) ``` 通过`types`模块可验证: ```python import types isinstance(add, types.FunctionType) # True isinstance(calc.multiply, types.MethodType) # True ``` #### 5. **作用范围** - 函数:全局或模块作用域。 - 方法:仅在类或实例作用域内有效。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值