作为练习,我被问到要在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
答案 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():
我使用这两个更改运行您的代码并且它可以工作并捕获明显的错误,但您可能希望进行更多测试。