网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受
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
89#__slots__ = (‘name‘,‘age‘,‘printNameAndAge‘,‘printName‘)#该行启用后,会限制User类可以使用的属性和方法
使用types.MethodType动态绑定
1
from classtest.user import User
2import types
3 4# 将函数printNameAndAge作为方法,添加到user实例上 5 user=User("test",28)
6def printNameAndAge(self):
7print(self.name,self.age)
8 user.printNameAndAge=types.MethodType(printNameAndAge,user)
9 user.printNameAndAge()#test 28101112# 将函数printName作为方法,添加到User类上,新生成的实例都可以使用(不推荐使用这种方法,因为有时候没办法确定,类添加方法和类实例化的先后顺序)13def printName(self):
14print(self.name)
15 User.printName=printName
16 user.printName()#test1718 user2=User("test2",29)
19 user2.printName()#test22021def printAge(self):
22print(self.age)
23 user.printAge=printAge#AttributeError: ‘User‘ object has no attribute ‘printAge‘242526# #下面的函数中没有添加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=printNAndA32# 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=printN40# User.printN("test3")#test3
p.s.
Java中只有方法没有函数
参考:
https://blog.csdn.net/amoscn/article/details/77074403
https://www.cnblogs.com/semon-code/p/8257826.html
原文:https://www.cnblogs.com/moonpool/p/11333541.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!