1,特殊装饰器
类中定义的普通方法(即实例方法),需要先实例化类的一个对象再调用,无法直接用类调用。而被@classmethod或@staticmethod装饰过的方法,可以不需要实例化,直接以“类名.方法名()”的方式来调用。
三个装饰器都是在类中使用:
@property : 将函数封装为属性。需要参数
self
,实例对象直接调用该方法,无需()
。@classmethod :用于装饰“类方法”。需要参数
cls
,无需self
。该类方法可以直接被调用,而无需实例化。无 self 参数,也无法访问实例化后的对象该类方法只能访问类属性,而无法访问实例属性。@staticmethod :静态方法。无需参数
cls、self
。被装饰的方法会成为静态方法,无需实例化可以调用。
代码实现
import time
class Date(object):
def __init__(self, year, month, day):
self._year = year
self._month = month
self._day = day
@classmethod
def today(cls):
todayBackup = time.localtime()
return cls(todayBackup.tm_year, todayBackup.tm_mon, todayBackup.tm_mday)
@property
def printtime(self):
return str(self._year)+'-'+str(self._month)+'-'+str(self._day)
@staticmethod
def timeadd(a,b):
return a+b
today = Date.today() # 注意此处直接调用了方法,并没有初始化生成实例类Date()
print(today.printtime) # 2022-5-10
print(Date.timeadd(2,1)) # 3
上述类中综合使用了三个参数,一个巧妙之处是,整个过程中没有明确指定初始化参数就形成了实例化 today
类.