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

Reply via email to