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

0. 总结:
(1)方法需要对象,函数不需要对象。所以有对象的是方法,无对象的是函数。
(2)一句话式总结:
与类和实例无绑定关系的function都属于函数(function);
与类和实例有绑定关系的function都属于方法(method)。

1. 定义
函数function : A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.仅是数学公式
方法method:A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).基于对象进行的处理

2. 方法
方法需要配合对象来使用,不能单独使用。如:

list = [1, 2, 3, 4]
list.pop()  # pop()是list的一个方法
print(list)

3. class外部定义的可执行函数——函数
分类:内置函数、匿名函数、递归函数
举例说明:

def quote():
    print("abc")  # A 内置函数,由“函数名(参数)”进行调用
    
quote()  # B 自定义函数,用def来进行函数的自定义,调用同内置函数

abc = lambda x, y: x * y
print(abc(2, 3))  # C 匿名函数,lambda是关键字,可多个参数,不需要函数名

def hey(n):  
    if n==1:
        return 1
    return n * hey(n - 1)

print(hey(6))  # D 递归函数,在函数里面调用函数,千万要避免死循环。

4. class内部定义的方法——函数、方法
4.1 class内定义方法的3种方式区别:

常规方式 @classmethod修饰方式 @staticmethod修饰方式
定义方式 需要通过self参数隐式的传递当前类对象的实例。self通常用作实例方法的第一参数,来传递当前类对象的实例 需要通过cls参数传递当前类对象。cls通常用作类方法的第一参数,来传递当前类对象 与class外部的普通函数是一样的,不强制要求传递参数。和class没有绑定关系
绑定对象 class的实例,如a class,如A 没有参数绑定,没有对象
调用方式 a.fun()方法 A.fun()方法 a.class_fun()方法 A.class_fun()方法 a.static_fun()函数 A.static_fun()函数

注1:self和cls的区别不是强制的,只是PEP8中一种编程风格。

class A():
	def fun(self):	# 定义方法:常规方式
	pass
	@classmethod
	def class_fun(cls):	# 定义方法:@classmethod修饰方式
	pass
	@staticmethod
	def static_fun():	# 定义方法:@staticmethod修饰方式
	pass

a=A()

4.2 class内部定义的方法-函数和方法的调用
举例说明:

class A:
    def fun(self):
        return 'normal'
    @classmethod
    def class_fun(cls):
        return 'classmethod'
    @staticmethod
    def static_fun():
        return 'staticmethod'

a = A()  # 创建一个类,将类进行实例化

A.fun("1")  # 调用函数
a.fun()  # 实例调用方法
print(A.fun)  # 函数,而不是方法
print(a.fun)  # 将类实例当成对象,调用方法,而不是函数
print("-"*80)
print(A.class_fun)  # 类方法classmethod,将类当成对象,调用方法
print(a.class_fun)  # 类方法classmethod,将类当成对象,调用方法
# classmethod对应的函数不需要实例化,第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
print("-"*80)
print(A.static_fun)  # 静态方法staticmethod,无需实例化,调用函数
print(a.static_fun)  # 静态方法staticmethod,无需实例化,调用函数
# staticmethod 返回函数的静态方法。 

结果返回验证:

<function A.fun at 0x000001DB5C14C168>
<bound method A.fun of <__main__.A object at 0x000001DB5C137A08>>
--------------------------------------------------------------------------------
<bound method A.class_fun of <class '__main__.A'>>
<bound method A.class_fun of <class '__main__.A'>>
--------------------------------------------------------------------------------
<function A.static_fun at 0x000001DB5C14C288>
<function A.static_fun at 0x000001DB5C14C288>

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

你可能感兴趣的:(python)