2016-09-07 4 views
0

他のモジュールをインポートせずにこのように動作するクラスを作るには?モジュールなしの2つのクラスの属性を増分しますか?

>>date(2014,2,2) + delta(month=3) 
>>(2014, 5, 2) 
>> 
>>date(2014, 2, 2) + delta(day=3) 
>>(2014, 2, 5) 
>>date(2014, 2, 2) + delta(year=1, month=2) 
>>(2015, 4, 2) 

これは私のコードです:

# class delta(date): 
#  year = date(year) 
#  def __init__(self,y,m,d): 
#   self.y = y + year 
#   self.m = m 
#   self.d = d 
#  def __call__(self): 
#   return self.y, self.m, self.d 
class date(object): 
    def __init__(self,year,month,day): 
     self.year = year 
     self.month = month 
     self.day = day 
    def __call__(self): 
     return self.year, self.month, self.day 
+1

'delta'は独自のクラスでなければなりません、あなたは' date'クラスで 'delta'関数を作成できますか? – depperm

+0

デルタをクラス –

+0

として作成しました。確かに、これを行う方法はたくさんあります。 '__add__'と' __iadd__'をチェックしてください。 –

答えて

1

__add__メソッドをオーバーライドします。デルタクラスでは、__init__のデフォルトパラメータを与えます。したがって、1つまたは2つの引数で呼び出すことができます。

class delta(): 
    def __init__(self,year=0,month=0,day=0): 
     self.y = year 
     self.m = month 
     self.d = day 
    def __call__(self): 
     return self.y, self.m, self.d 

class date(): 
    def __init__(self,year,month,day): 
     self.year = year 
     self.month = month 
     self.day = day 
    def __call__(self): 
     return self.year, self.month, self.day 
    def isLeapYear (self): 
     if ((self.year % 4 == 0) and (self.year % 100 != 0)) or (self.year % 400 == 0): 
      return True 
     return False 
    def __add__(self,delta): 
     self.year=self.year+delta.y 
     self.month=self.month+delta.m 
     if self.month>12: 
      self.month=self.month%12 
      self.year+=1 
     self.day=self.day+delta.d 
     if self.isLeapYear() and self.day>29: 
      self.day=self.day%29 
      self.month+=1 
     elif not self.isLeapYear() and self.day>28: 
      self.day=self.day%28 
      self.month+=1 
     return self.year, self.month, self.day 

print(date(2014, 2, 2) + delta(year=1, month=2)) # (2015, 4, 2) 

birthdate=date(1990,1,1) 
currentyear=birthdate+delta(year=20,month=2,day=5) 
print(currentyear) # (2010, 3, 6) 
+0

ワオ..これは完璧な答えです...ありがとうございますサー –

関連する問題