绑定方法与非绑定方法

class a:
    def fuc(self):
        print (self)
aa=a()
print (a.fuc)#类直接调用的方法,称为非绑定方法
print (aa.fuc)#类的对象调用的方法,成为绑定方法

aa.fuc()#因为aa.fuc是绑定方法,就是已经把self参数提前进行了绑定,这个参数就是调用者本身。在调用的时候无需再传餐了。
a.fuc(aa)#因为是非绑定方法,所以调用时必须给self传参,注意,在py2中,传递的参数必须是a类的对象,而在py3中,传递的参数可以是任何值,从这点来说,在py3中,在类中定义的方法跟普通函数基本没什么区别

 这是第一种情况,就是在没加装饰器的情况下,实例调用的方法就称之为绑定方法,类调用的方法就是非绑定方法。实例调用绑定方法时总是会给方法传递他自己本身作为第一个参数。无论是在py2还是在py3下。而对于非绑定方法,py2要求必须给方法传递类的对象作为第一个参数。所以在定义方法的时候参数不能为空,否则报错。而py3则无此限制,定义的方法,参数可以为空,如果为空,则类调用非绑定方法的时候就不必传参了。

 

第二中情况,当有个方法加入classmethod装饰漆时,则这个方法是类的绑定方法,但与对象实例的绑定方法有区别的时,类的绑定方法无论是类调用,还是对象调用,都会把类作为第一个参数传递给方法

 

 

以上两种情况,要么是与类绑定,要么是以对象绑定,有没有一种是既不绑定类也不绑定对象呢?只需要加装饰漆

@staticmethod,可以解除绑定关系,将一个类中的方法,变为一个普通函数。

 

  下面,我们来看看代码示例:

 1 import hashlib
 2 import time
 3 class MySQL:
 4     def __init__(self,host,port):
 5         self.id=self.create_id()
 6         self.host=host
 7         self.port=port
 8     @staticmethod
 9     def create_id(): #就是一个普通工具
10         m=hashlib.md5(str(time.clock()).encode('utf-8'))
11         return m.hexdigest()
12 
13 
14 print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #查看结果为普通函数
15 conn=MySQL('127.0.0.1',3306)
16 print(conn.create_id) #<function MySQL.create_id at 0x00000000026FB9D8> #查看结果为普通函数

上面的输出结果,我们可以看出,使用了@staticmethod装饰了一个函数,那么这个函数跟普通函数没有什么区别。既然是普通函数,那么就遵从函数参数传递规则,有几个参数就传递几个参数。

 

 

 总结:不要纠结于概念,只要知道会是怎样的效果就行了:

默认情况下,当实例调用方法时,会给方法传递参数。

 

参考https://www.cnblogs.com/vipchenwei/p/7126772.html

 

posted @ 2018-05-01 13:58  扫驴  阅读(233)  评论(0编辑  收藏  举报