python,golang中的函数和方法

前言

以前觉得 python 中函数和方法是一样的,直到接触 golang,发现 golang 中的函数和方法有本质的区别,然后反看 python 中函数和方法也有一定的区别

python 中的函数和方法

python中的方法都是 method,函数都是 function,其中函数 method 又分 bound 和 unbound 方法

from types import FunctionType,MethodType,这两个类就是我们的函数类和方法类

python中的函数

1
2
3
4
# coding=utf-8
def my_func():
pass
print my_func

输出结果:

1
2
<function my_func at 0x106fcaaa0>
[Finished in 0.1s]

这里的 my_func 是一个 function 函数对象,在 python 中类中的静态方法,也是函数对象

1
2
3
4
5
6
7
# coding=utf-8
class ClassName(object):
@staticmethod
def my_func():
pass

print ClassName.my_func

输出结果:

1
2
<function my_func at 0x108727b18>
[Finished in 0.0s]

python中的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding=utf-8
class ClassName(object):
def my_func(self):
pass

@staticmethod
def my_func_1():
pass

@classmethod
def my_func_2(cls):
pass

print ClassName.my_func
print ClassName.my_func_1
print ClassName.my_func_2
obj = ClassName()
print("-------------------")
print obj.my_func
print obj.my_func_1
print obj.my_func_2

输出结果:

1
2
3
4
5
6
7
8
<unbound method ClassName.my_func>
<function my_func_1 at 0x10e618b90>
<bound method type.my_func_2 of <class '__main__.ClassName'>>
-------------------
<bound method ClassName.my_func of <__main__.ClassName object at 0x10e61d050>>
<function my_func_1 at 0x10e618b90>
<bound method type.my_func_2 of <class '__main__.ClassName'>>
[Finished in 0.1s]

这个例子中方法分为了两种,unbound method 方法和 bound method,他们的区别在于,unbound method 是类实例方法,因为类还没有实例化,所以它还没能绑定到指定的对象,其他的都是 bound method

golang 中的函数和方法

golang 中函数和方法是完全不同的两个概念

golang中的函数

golang 函数格式如下:

1
2
3
func function_name( [parameter list] ) [return_types] {
函数体
}

其中 func 是声明函数的语法

function_name 是定义的函数名称

[parameter list] 是我们的参数列表,里面标定了参数类型

[return_types] 是我们的返回值类型列表,可以有多个返回值

golang中的方法

我们定义一个变量 myint 类型为 int,然后定义了一个方法,方法和函数的区别在于 func 之后跟着的是函数名,还是一个对象,意思是这个函数属于哪个对象(并且返回值也是一个对象,有点绕,有点像给实例化后的对象赋值)

golang 中的方法我们通常用在结构体和自定义数据类型的场景中,更喜欢和结构体进行对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type myint int

//my_func_1 这个函数属于 myint 对象
func (p *myint) my_func_1 () (myint) {
*p = *p * *p
return *p
}

//my_func_2 这个函数属于 myint 对象
func (p myint) my_func_2 () (myint) {
p = p * p
return p
}

func main() {
var kkk myint = 3
ret := kkk.my_func_1()
fmt.Println(kkk)
fmt.Println(ret)
}

这里有一个小区别,对于 my_func_1 和 my_func_2,用指针传递的是引用传递,另一个是值传递,引用传递会改变原来传入参数的值,而值传递不会(和 c 语言类似)

总结

python 和 golang 中函数和方法都是两个不同的概念,只是在 golang 中它的区别更明显,功能也更强大

坚持原创技术分享,您的支持将鼓励我继续创作!