类中定义的函数分成两大类
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) # 类的绑定方法
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 定义的格式内容
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、非绑定方法:用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)
.