zoukankan      html  css  js  c++  java
  • (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就是为了给类新增一种或多种实例化方式,新增一种指的是实例化的时候值得来源不同

  • 相关阅读:
    2012 里SQL Server Data Tools进程处理数据库时 怎么没有更改设置呢?
    如何重启数据库服务
    如何更改sql server登陆密码
    备份和还原数据库
    MySQL查询优化之性能提升一个数量级
    浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
    浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
    模板在二叉树和队列中的应用(借助队列广度遍历二叉树)
    SSH公钥登录且禁止密码登录及更改默认端口
    springmvc+druid+dataSource配置的两种方式
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10125863.html
Copyright © 2011-2022 走看看