• (9)绑定方法和非绑定方法


    绑定方法

    @classmethod 函数功能上面添加这个内置函数就是绑定给类

    绑定给类的,参数里面就是cls,cls这个是规范的写法,cls就是指传入的是类

    特殊之处:

    绑定给谁就应该由谁来调用,会将调用者(点左边的就是调用者)当做第一个参数自动传入

    绑定对象的方法:

    类中定义的函数在没有被任何装饰器装饰的情况下,默认就是绑定给对象的,绑定给对象的方法应该由对象来调用,自动传入的是对象

    绑定类的方法:

    为类中定义的函数添加装饰器classmethod,绑定类的方法应该由类来调用,自动传入的是类

    非绑定方法(指的就是函数)

    @staticmethod 函数功能上面添加这个内置函数,就是非绑定方法

    特殊之处: 就是一个普通函数,既不与类绑定也不与对象绑定,意味着谁都可以来调用,无论谁调用都只是

    一个普通函数而已,没有自动传值的效果

    绑定方法实例

    class People:
    def __init__(self,name,age):
    self.name=name
    self.age=age

    def tell_info(self):
    print('<%s:%s>' %(self.name,self.age))

    @classmethod #这里绑定给类,就必须是类来调用
    def func1(cls):
    print(cls)

    print(People.func1)#这个查看属性
    People.func1() #这里就是用类来调用下面的功能
    obj = People('egon',18) #也能用对象来调用
    print(obj.func1) #查看属性
    obj.func1() #对象调用的时候还是调用了类
    PS:绑定给类的传入的一定是类,绑定给对象的传入的一定是对象
    PS:绑定给类的,对象也能调用,但是对象调用时候传入的还是类
    PS:绑定给对象的方法,类也能调用,但是类调用的时候就是一个普通函数
    PS:绑定方法就是将类变成一个变量的形式传入,这样写的时候不管变量名如何改变,传入的值都会跟着改变,程序更有灵活性

    非绑定给方法实例

    class People:
    def __init__(self,name,age):
    self.name=name
    self.age=age

    def tell_info(self): #这里类访问的时候是一个函数,对象访问的时候就是一个绑定给对象的方法
    print('<%s:%s>' %(self.name,self.age))

    @classmethod #这里是绑定方法
    def func1(cls):
    print(cls)

    @staticmethod #这里是非绑定方法,不与任何人绑定
    def func2(x,y):#这里有参数调用的时候必须传入参数,没有就不用传
    print('=======run',x,y)


    obj=People('egon',18)

    print(People.func2)#这里打印类调用看到是是函数
    print(obj.func2) #这里打印对象调用看到的是函数
    PS:所以非绑定方法不管是类调用还是对象调用python里面都变成了函数,不与任何人绑定

    People.func2(1,2) #非绑定对象就是一个普通函数,调用时候就按照普通函数的方法运行,需要传入参数就要传入
    obj.func2(1,2) #非绑定对象就是一个普通函数,调用时候就按照普通函数的方法运行,需要传入参数就要传入

    类中定义的函数可以分为两大类三小种

    两大类就是绑定和非绑定

    三小种就是

    1、没有被装饰器装饰过的(属于默认绑定给对象,这种函数一定要有一个参数self),默认由对象来调用,自动传值,类也能调用,但是类调用就是一个普通函数,必须按照普通函数的规则和参数来调用

    2、被classmethod装饰过的(默认绑定给类的),应该由类来调用,会将类自动传入,对象也能调用,但是对象调用传入的还是类

    3、被staticmethod装饰过的(非绑定),谁都可以调用,就是一个普通函数,普通函数没有自定传值

    绑定与非绑定实例(使用的具体场景)

    import settings #seting #文件里面放了参数,让下面的代码调用

    class MySQL:
    def __init__(self,ip,port):
    self.id=self.create_id() #定义类阶段内部代码都已运行,所以这行代码可以访问到
    self.ip=ip
    self.port=port

    def tell_info(self): #查看功能
    print('<%s:%s>' %(self.ip,self.port))

    @classmethod #绑定方法将类以变量形式传入
    def from_conf(cls): #从文件内读取参数
    return cls(settings.IP,settings.PORT)

    @staticmethod #非绑定方法,增加一个独一无二的ID值
    def create_id():
    import uuid #调用uuid模块
    return uuid.uuid4()
       PS:uuid模块,每次调用产生不同的ID编号

    obj=MySQL('1.1.1.1',3306)
    print(obj.id) #对象调用ID,产生一个对象独一无二的ID,这里查看ID
    obj1=MySQL.from_conf() #类赋值给对象
    obj1.tell_info() #通过对象调用完成实例化参数

    PS:classmethod就是为了给类新增一种或多种实例化方式,新增一种指的是实例化的时候值得来源不同

  • 相关阅读:
    JS倒计时执行操作
    美化radio和checkbox样式
    ajax 多个表单值问题,表单序列化加其它表单值
    .net中的路径问题
    Response.Redirect 打开新窗口的两种方法
    GRIDVIEW FINDCONTROL的使用
    如何验证gridview控件的编辑行?如何获得gridview模板列<ItemTemplate/>中Label值?
    在Repeater的HeaderTemplate和FooterTemplate模板中寻找控件FindControl
    在GridView中使用FindControl(2)
    构造函数(C# 编程指南)
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10125863.html
Copyright © 2020-2023  润新知