绑定方法与非绑定方法
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