以日期类为例
class Date:
#检查数据合法、私有化属性(_)
def set_data(self,m,d):
if m >= 1 and m<=12:
self._month=m
else:
raise ValueError("Invalid month:"+str(m))
if d >= 1 and d<=self.days_in_month():
self._day=d
else:
raise ValueError("Invalid day:"+str(d))
#构造函数
def __init__(self,month=1,day=1):
self.set_data(month,day)
#访问器:只读
@property
def month(self):
return self._month
@property
def day(self):
return self._day
#赋值器:写--客户端代码可以直接修改属性
@month.setter
def month(self,value):
self.set_data(value,self._day)
@day.setter
def day(self,value):
self.set_data(self._month,value)
#返回月份的最大天数(不考虑闰年)
def days_in_month(self):
if self.month in {4,6,9,11}:
return 30
elif self.month == 2:
return 28
else:
return 31
#天数+1
def advance(self):
self._day += 1
if self._day > self.days_in_month():
self._month += 1
self._day = 1
if self._month > 12 :
self._month = 1
#返回
def __str__(self):
return str(self.month)+'/'+str(self.day)
#比较
def __eq__(self,other):
return self.month == other.month and self.day ==other.day
birthday = Date(12,31)
print(f"Month/Day: {birthday.month}/{birthday.day}")
birthday.advance()
print(f"Month/Day: {birthday.month}/{birthday.day}")
print(birthday)
Month/Day: 12/31
Month/Day: 1/1
1/1
d1 = Date(12,3) d2 = Date(12,3) print(d1 == d2) d1.day = 10 print(d1.day) d2.day = 36
True
10
ValueError: Invalid day:36



