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

.

posted @ 2018-06-25 17:16  H-JIACHENG  阅读(664)  评论(0编辑  收藏  举报