python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受

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

 

“与类和实例无绑定关系”就道出了其中的关键

我们知道python是动态的编程语言,python的类除了可以预先定义好外,还可以在执行过程中,动态地将函数绑定到类上,绑定成功后,那些函数就变成类的方法了。

 

定义User类

可以使用__slots__来限制绑定的属性和方法

1 user.py
2 
3 class User():
4 
5     def __init__(self,name,age):
6         self.name=name
7         self.age=age
8 
9     #__slots__ = ('name','age','printNameAndAge','printName')#该行启用后,会限制User类可以使用的属性和方法

使用types.MethodType动态绑定

 1 from classtest.user import User
 2 import types
 3 
 4 # 将函数printNameAndAge作为方法,添加到user实例上
 5 user=User("test",28)
 6 def printNameAndAge(self):
 7     print(self.name,self.age)
 8 user.printNameAndAge=types.MethodType(printNameAndAge,user)
 9 user.printNameAndAge()#test 28
10 
11 
12 # 将函数printName作为方法,添加到User类上,新生成的实例都可以使用(不推荐使用这种方法,因为有时候没办法确定,类添加方法和类实例化的先后顺序)
13 def printName(self):
14      print(self.name)
15 User.printName=printName
16 user.printName()#test
17 
18 user2=User("test2",29)
19 user2.printName()#test2
20 
21 def printAge(self):
22     print(self.age)
23 user.printAge=printAge#AttributeError: 'User' object has no attribute 'printAge'
24 
25 
26 # #下面的函数中没有添加self,可以不需要使用types.MethodType(),但是没有办法访问实例中的内容。从某种意义上来说,printNAndA依然是函数,因为没有使用self绑定。
27 # user3=User("test3",30)
28 # def printNAndA(name,age):#这里定义时就和上面的不一样
29 #     print(name,age)
30 # #将函数printNameAndAge作为方法,添加到user实例上
31 # user3.printNAndA=printNAndA
32 # user3.printNAndA("test4",31)#test4 31 #因为没有绑定self,所以("test3",30)的内容是无法通过printNAndA()访问的
33 # user3.addr="上海"
34 # print(user3.addr)#上海
35 # 
36 # def printN(name):
37 #     print(name)
38 # #将函数printName作为方法,添加到User类上
39 # User.printN=printN
40 # User.printN("test3")#test3

 

p.s.

Java中只有方法没有函数

 

参考:

https://blog.csdn.net/amoscn/article/details/77074403

https://www.cnblogs.com/semon-code/p/8257826.html

 

posted @ 2019-08-10 23:43  月色深潭  阅读(589)  评论(0编辑  收藏  举报