类中定义的函数分成两大类
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)
.
来源:https://www.cnblogs.com/tootooman/p/9225208.html
