Python中函数与方法的区别:通用特性及缩进疑问
Python 函数(Function)与方法(Method)的核心区别
先直接给你厘清关键点:
1. 绑定关系才是本质区别,而非通用性或缩进
你说的「方法是类特有的函数」方向是对的,但更准确的表述是:
- 函数是独立的代码块,不依附任何类或实例,直接就能调用,完全通用。比如随便在
.py文件里写个def add(a, b): return a+b,直接add(1,2)就能运行,和任何类都没关系。 - 方法是绑定到类或实例的函数,调用时会自动传递绑定对象作为第一个参数(实例方法是
self,类方法是cls)。它的「特有性」不是因为写在类里,而是因为和类/实例绑定了。
举个代码例子:
# 这是独立函数 def greet(name): print(f"Hello, {name}!") # 这是类里的方法 class Person: def greet(self, name): print(f"Hello, {name}! I'm {self.__class__.__name__}") # 调用函数,直接传参数就行 greet("Alice") # 调用方法,必须先有实例(或类,针对类方法) p = Person() p.greet("Bob") # 这里Python自动把p作为self传进去
2. 缩进只是语法表现,不是本质区别
你看到的「方法在类内缩进、函数在类外无缩进」只是Python定义类成员的语法规则,不是两者的核心差异:
- 你可以在函数里嵌套另一个缩进的函数,但它依然是普通函数,不是方法:
def outer(): # 这个inner是嵌套函数,缩进了,但不是方法 def inner(): print("I'm nested, but still a function") inner()
- 反过来,你可以把一个独立函数绑定到类实例上,让它变成方法,这时候它根本没写在类里:
import types def greet_func(self, name): print(f"Hello {name}, from {self}") class Person: pass p = Person() # 把函数绑定为实例的方法 p.greet = types.MethodType(greet_func, p) p.greet("Charlie") # 这里会自动把p作为self传入,完全是方法的调用方式
总结
- 核心区别:是否与类/实例绑定,方法调用时会自动传入绑定对象,函数不会。
- 通用性:函数确实是通用独立的,方法则依赖绑定的类/实例。
- 缩进:只是Python定义类成员的语法形式,不是本质区别。
内容的提问来源于stack exchange,提问作者randomvlad
相关产品推荐
相关产品推荐

