On Fri, Dec 16, 2011 at 5:26 AM, Steven D'Aprano <st...@pearwood.info>wrote:
> rail shafigulin wrote: > >> i writing some code to do device testing at my work. testing is related to >> date and time, so naturally i decided to create a class that inherits from >> datetime.datetime. main reason is that i need to add, subtract and compare >> datetime objects and datetime.datetime allows me to do that. here is the >> code: >> >> class LTime(datetime.datetime): >> TOLERANCE = 10 >> >> def __new__(self, year, month, day, *args): >> if year == 0: >> year = 2000 >> return super().__new__(self, year, month, day, *args) >> > > > By convention, the first argument of __new__ is normally spelled as "cls", > short for class, because the instance hasn't been created yet. > > > > def modify(self): >> self = self.replace(2012, 12, 12) >> print(self) >> > > The replace method creates a new datetime object. Just because you assign > it to the name "self" doesn't mean you can change the existing datetime > object. That is simply impossible: datetime objects are immutable, like > ints. > > You might not quite understand why modifying immutable objects would be > bad (which is why Python doesn't allow it). I can simulate the effect with > this simple wrapper class: > > >>> class Mutable: > ... def __init__(self, value): > ... self.value = value > ... def __str__(self): > ... return str(self.value) > ... __repr__ = __str__ > ... def add(self, value): > ... self.value += value > ... > >>> one = Mutable(1) # Pretend this is the int 1 > >>> print(one) > 1 > >>> x = one > >>> x.set(1) # pretend this was x += 1 > >>> one # the int 1 has been modified in place > 2 > > So if ints (and datetime objects) could be changed in place, you could > never be sure what value a literal like 1 would have. > > Obviously this is useful in some situations, which is why we have mutable > objects like lists. But datetime objects are not mutable, a design choice > made by the creator of the module, so you cannot change it. > > So you have to change your design. Instead of writing code like this: > > > today = LTime(2011, 12, 16) > # ... > # ... do stuff with today > # ... > today.modify(day=17) # fast forward in time to tomorrow > # ... > # ... do stuff with today, which is actually tomorrow > # ... > > you need to change your code to be more like this: > > > today = LTime(2011, 12, 16) > # ... > # ... do stuff with today > # ... > tomorrow = today.modify(day=17) > # ... > # ... do stuff with tomorrow > # ... > > > > > -- > Steven > ______________________________**_________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > http://mail.python.org/**mailman/listinfo/tutor<http://mail.python.org/mailman/listinfo/tutor> > Thanks for the explanation.
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor