python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)
Posted moonpool
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)的主要内容,如果未能解决你的问题,请参考以下文章