import datetime
class Person:
def __init__ (self,name,age):
self.name=name
self.age=age
@classmethod
def by_birth(cls,name, birth_year):
this_year=datetime.date.today().year
age=this_year-birth_year
return cls (name,age) #6
def get_info(self):
return "{0}'s age is {1}".format(self.name,str(self.age))
newton=Person('Newton',26) #7
print(newton.get_info())
hertz=Person.by_birth('hertz',1857) #8
print(hertz.get_info())
输出:
Newton's age is 26
hertz's age is 163
在代码中所定义的类person,根据初始化方法的参数,使用7创建实例。但是如果使用出生年份创建实例,则7不再支持,因为初始化age代表年龄。要解决这个问题,又不破坏初始化方法,就可以使用类方法装饰器,定义by_birth方法。在这个方法中,计算了age之后,再以6创建实例对象,8直接通过类名调用方法