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

    类中定义的函数分成两大类

    1、绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入)

                1. 绑定到类的方法:用classmethod装饰器装饰的方法。

                   为类量身定制

                   类.boud_method(),自动将类当作第一个参数传入

                  (其实对象也可调用,但仍将类当作第一个参数传入)

                2. 绑定到对象的方法:在类内部没有被任何装饰器装饰的方法。

                   为对象量身定制

                   对象.boud_method(),自动将对象当作第一个参数传入

                  (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

    绑定给对象的方法(略)

    绑定给类的方法(classmethod)

      classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法

    class Foo():
        def bar(self):
            print('bar')
        @classmethod  # 把一个方法绑定给类:类.绑定到类的方法(),会把类本身当做第一个参数自动传递到类的方法里面
        def test(cls,x):
            print(cls,x)  # 拿到一个类的内存地址后,就可以实例化或者引用类的属性了
    #
    # print(Foo.bar)
    #
    # print(Foo.test)
    f=Foo()
    print(f.bar)  # 对象的绑定方法
    print(f.test) # 类的绑定方法
    例1
    import time
    class Date:
        def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    
        @classmethod
        def now(cls):
            t=time.localtime()
            obj=cls(t.tm_year,t.tm_mon,t.tm_mday) 
        # 子类调用:obj=ChinaDate(年,月,日)
            return obj
    
        @classmethod
        def tomorrow(cls):
            t=time.localtime(time.time()+86400)
            obj=cls(t.tm_year,t.tm_mon,t.tm_mday)  
        # 哪个类调用就由哪个类帮忙生成实例并返回
            return obj
    
    class ChinaDate(Date):  # 继承父类
        def __str__(self):
            return '<year:%s,month:%s,day:%s>'%(self.year,self.month,self.day)
    
    
    d1=ChinaDate.now() 
    # 子类继承父类,在子类里找 now,没有,找父类,是一个类的绑定方法,这是子类去调用,所以转换为  obj=ChinaDate(年,月,日),然后 obj 返回给 d1
    print(d1)  
    # 想要打印对象的内存地址,去子类  ChinaDate 里面找有没有 str 方法,有直接返回 str 定义的格式内容
    例2
    import time
    class Date:
        def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    
        @classmethod
        def now(cls):
            t=time.localtime()
            obj=cls(t.tm_year,t.tm_mon,t.tm_mday) 
        # 子类调用:obj=ChinaDate(年,月,日)
            return obj
    
        @classmethod
        def tomorrow(cls):
            t=time.localtime(time.time()+86400)
            obj=cls(t.tm_year,t.tm_mon,t.tm_mday)  
        # 哪个类调用就由哪个类帮忙生成实例并返回
            return obj
    
    class ChinaDate(Date):  # 继承父类
        def __str__(self):
            return '<year:%s,month:%s,day:%s>'%(self.year,self.month,self.day)
    
    
    d1=ChinaDate.now() 
    # 子类继承父类,在子类里找 now,没有,找父类,是一个类的绑定方法,这是子类去调用,所以转换为  obj=ChinaDate(年,月,日),然后 obj 返回给 d1
    print(d1)  
    # 想要打印对象的内存地址,去子类  ChinaDate 里面找有没有 str 方法,有直接返回 str 定义的格式内容
    例3

    2、非绑定方法:用staticmethod装饰器装饰的方法

    不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已

    注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,就是一个普通函数,不管谁来调用,都没有自动传值一说

    在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数

    statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果

    import time
    class Date:
        def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    
        def test(self):      # 对象调用的这个是绑定方法
            print('from test')
    
        @staticmethod   # 非绑定函数,类和对象都可以调用,跟谁都不绑定
        def now():  # 用 Date.now() 的形式去产生实例,该实例用的是当前时间
            t=time.localtime()  # 获取结构化的时间格式
            obj=Date(t.tm_year,t.tm_mon,t.tm_mday)  # 由类去新建实例并且返回
            return obj
    
        @staticmethod
        def tomorrow():
            t=time.localtime(time.time()+86400)   # 加上一天的时间
            obj=Date(t.tm_year,t.tm_mon,t.tm_mday) # 新建实例并且返回
            return  obj
    
    
    
    # 以往是对象自己通过类的绑定方法,自己传值产生实例
    # 现在是类通过非绑定方法,给对象产生一个实例
    d1=Date.now()  # 通过类调用 类下面的now,实例化的另一种选择,不用再自己去传值
    print(d1.day)
    
    d2=Date.tomorrow()  # 通过类调用类的tomorrow,实例化一个对象
    print(d2.day)
    例1

    .

  • 相关阅读:
    windows下 删除指定文件夹里面一周前的所有文件和文件夹的bat
    freeswitch 把SIP注册信息数据库从SQLITE 改为MYSQL的方法
    memcached+Mysql(主从)
    Linux下的MySQL主主复制
    RabbitMQ php 使用
    如果你写PHP, 请多注意自己是否有良好的习惯
    MySQL主从配置的一些总结
    Mongodb与mysql语法比较
    Yii框架tips
    Windows下Python添加MySQLdb扩展模块
  • 原文地址:https://www.cnblogs.com/tootooman/p/9225208.html
Copyright © 2011-2022 走看看