当前位置:首页 > Python教程 > python技巧

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
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)!

相关教程推荐

其他课程推荐