如何在python中创建Date对象?

时间:2015-05-14 19:56:16

标签: python

作为练习,我被问到要在python中构建一个类,名为" Date"。 我必须根据要求建立一些功能。第一个是" init "需要一天,一个月,一年,几小时和几分钟的模型以及返回一个有效的Date对象(有效时表示一个月,例如,不能是13)。下一个是如果某些数据无效,则会引发特定错误的函数,例如每月13个。 我的问题是每当我打电话给"日期(23,14,1998)。月"时,它会返回" 13"而不是错误。我也不确定如何创建有效的Date对象。我可以用你的帮助。我的代码:

class Date:
    days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def __init__(self, day, month, year, hours=0, minutes=0):
        self.day=day
        self.month=month
        self.year=year
        self.hours=hours
        self.minutes=minutes

    def validate(self):
        if type(self.month)==int:
            if self.month<1:
                raise ValueError('Error: month value must be positive')
            if self.month>12:
                raise ValueError('Error: month value cannot exceed 12')
        else:
            raise ValueError('Error: month value must be an integer')
        if type(self.day)==int:
            if self.day>days_in_month(self):
                raise ValueError('Error: maximum days in this month exceeded')
            elif self.day<1:
                raise ValueError('Error: day value must be positive')
        else:
            raise ValueError('Error: day value must be an integer')
        if type(self.hours)==int:
            if self.month>23:
                raise ValueError('Error: hours value cannot exceed 23')
            elif self.month<0:
                raise ValueError('Error: hours value cannot be negative')
        else:
            raise ValueError('Error: hours value must be an integer')
        if type(self.minutes)==int:
            if self.month>59:
                raise ValueError('Error: minutes value cannot exceed 59')
            elif self.month<0:
                raise ValueError('Error: minutes value cannot be negative')
        else:
            raise ValueError('Error: minutes value must be an integer')

    def days_in_month(self):
        if self.month == 2 and self.is_leap_year():
               return 29
        return self.days_per_month[self.month-1]

    def is_leap_year(self):
        if self.year % 400 == 0:
            return True
        elif self.year % 100 == 0:
            return False
        elif self.year % 4 == 0:
            return True
        else:
            return False

4 个答案:

答案 0 :(得分:4)

您应该调用validate方法,最好是在构造函数时(即在__init__方法中)。这将确保在任何人使用Date对象之前完成错误检查。

答案 1 :(得分:3)

在分配变量后,请考虑在self.validate()中调用__init__

答案 2 :(得分:2)

两件事:第一,代码上有一些错误。您必须正确缩进init方法。其次,您复制并粘贴上面的部分,并将月份放在应该分钟的几个地方,例如:

if type(self.hours)==int:
        if self.month>23: ## Should be HOURS
            raise ValueError('Error: hours value cannot exceed 23')
        elif self.month<0: ## should be hours
            raise ValueError('Error: hours value cannot be negative')
    else:
        raise ValueError('Error: hours value must be an integer')
    if type(self.minutes)==int:
        if self.month>59: ## Should be MINUTES
            raise ValueError('Error: minutes value cannot exceed 59')
        elif self.month<0: ## Should be MINUTES
            raise ValueError('Error: minutes value cannot be negative')
    else:
        raise ValueError('Error: minutes value must be an integer')

检查其余代码。此外,您应该在init方法结束时调用validate函数:

class Date:
days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

    def __init__(self, day, month, year, hours=0, minutes=0):
        self.day=day
        self.month=month
        self.year=year
        self.hours=hours
        self.minutes=minutes  
        self.validate()

答案 3 :(得分:2)

您可以在__init__中查看:

class Date:
    days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

    def __init__(self, day, month, year, hours=0, minutes=0):
        self.day=day
        self.month=month
        self.year=year
        self.hours=hours
        self.minutes=minutes
        self.validate()

另请注意,validate()行if self.day>days_in_month(self):中的错误应为if self.day>self.days_in_month():

我使用这两个更改运行您的代码并且它可以工作并捕获明显的错误,但您可能希望进行更多测试。