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 字符串。 agee-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 - 从出生日期获取员工年龄的类?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫从日期获取年龄(例如:出生日期)

EXCEL表格中 怎么用函数从身份证号获取出生日期,年龄、性别

Java 根据出生日期获得年龄

python解析身份证获取年龄出生日期性别

SQL计算年龄

SQL由身份证号计算出生日期和年龄