zoukankan      html  css  js  c++  java
  • 绑定方法与非绑定方法

    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

  • 相关阅读:
    legend3---图片裁剪实例代码
    JPG 和 JPEG 格式有什么区别
    jpg与png图片的优缺点
    心得体悟帖---200320(legend3它的真实意义,在于资质提升,一举多得)
    心得体悟帖---200320(觉得录课录不下去了,可以去招聘市场找找激励,这个真的特别有效)
    心得体悟帖---200320(我必不甘于人之下,所以还是得自己干,自己好好录课)
    ES6参考---Promise对象
    范仁义js课程---70、sort方法
    JS实现异步编程的4种方法(总结)
    JS执行机制详解
  • 原文地址:https://www.cnblogs.com/saolv/p/8976156.html
Copyright © 2011-2022 走看看