Python - 从出生日期获取员工年龄的类?
Posted
技术标签:
【中文标题】Python - 从出生日期获取员工年龄的类?【英文标题】:Python - a Class to get employee age from Date of birth? 【发布时间】:2020-12-29 22:14:24 【问题描述】:import datetime
class Employee:
def __init__ (self,first,last,pay,dob):
self.first = first
self.last = last
self.pay = pay
self.email = first + "." + last + "@company.com"
self.dob = dob
def fullname(self):
return ' '.format(self.first,self.last)
def age(dob):
today = date.today()
return today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day))
emp1 = Employee("aa","ss",122,date(1991,2,3))
emp2 = Employee("ww","ii",637,date(1997,8,24))
emp3 = Employee("ee","oo",986,date(1986,10,19))
#driver code
print(Employee.age(emp2))
我收到以下错误:
AttributeError: 'Employee' 对象没有属性 'year'
这有什么不正确的?
【问题讨论】:
方法的第一个参数是self
,而不是dob
。你在def age(dob)
中调用的dob
实际上是Employee
实例。
【参考方案1】:
您的 Employee.age()
方法签名只有一个参数 - dob
。当您调用它时,传递的第一个参数是实例。按照惯例,我们为此使用参数self
。但是你使用dob
。像其他方法一样坚持约定。然后使用self.dob.year
from datetime import date
class Employee:
def __init__ (self,first,last,pay,dob):
self.first = first
self.last = last
self.pay = pay
self.email = first + "." + last + "@company.com"
self.dob = dob
@property
def fullname(self):
return ' '.format(self.first, self.last) # in 3.6 return f'self.first self.last'
def age(self):
today = date.today()
return today.year - self.dob.year - ((today.month, today.day) < (self.dob.month, self.dob.day))
emp1 = Employee("aa","ss",122,date(1991,2,3))
emp2 = Employee("ww","ii",637,date(1997,8,24))
emp3 = Employee("ee","oo",986,date(1986,10,19))
#driver code
print(emp1.age())
注意,我还添加了@property 装饰器,所以 fullname 是“只读”属性 并修复了导入
在 3.6+ 中,您可以使用 f 字符串。 age
和 e-mail property
,如 fullname
可能是只读属性(即,您不应指定与 dob
矛盾的年龄),例如
@property
def age(self):
today = date.today()
return today.year - self.dob.year - ((today.month, today.day) < (self.dob.month, self.dob.day))
那你就可以这样使用了
print(emp1.age) # note the difference when it is method in the original class, and now when its property
【讨论】:
你的意思是print(emp2.age())
。
@Adirio,绝对。课堂上要解决的问题太多了,我忽略了最后一行。修好了。
这是我的课,我也会把age
方法变成一个属性,也就是在age
方法之前添加@property
并将它用作print(emp1.age)
而不是@ 987654338@。您可以建议他也进行该更改,解释这两个更改,以便他看到方法和属性的区别。
@Adirio 是的,我刚刚提到过 :-)【参考方案2】:
您的employee
类没有年份属性
但是
employee.dob
有这个
import datetime
from datetime import date
class Employee:
def __init__ (self,first,last,pay,dob):
self.first = first
self.last = last
self.pay = pay
self.email = first + "." + last + "@company.com"
self.dob = dob
def fullname(self):
return ' '.format(self.first,self.last)
def age(dob):
today = date.today()
dob = dob.dob # get dob from the object(of employee class) <<<<< Single change
return today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day))
emp1 = Employee("aa","ss",122,date(1991,2,3))
emp2 = Employee("ww","ii",637,date(1997,8,24))
emp3 = Employee("ee","oo",986,date(1986,10,19))
#driver code
print(Employee.age(emp2))
【讨论】:
使用代表“出生日期”的dob
作为实例的参数名称而不是传统的self
不是一个好主意...
我只是想使用最小更改选项并解释原因!但我同意你的观点,谢谢你的评论
纠正常见错误也将帮助他提高技能,其中包括使用print(emp2.age())
而不是print(Employee.age(emp2))
以上是关于Python - 从出生日期获取员工年龄的类?的主要内容,如果未能解决你的问题,请参考以下文章