Re: [Python-Dev] subclassing builtin data structures

2015年2月13日 14:58:16 -0800

On Fri, Feb 13, 2015 at 4:44 PM, Neil Girdhar <[email protected]> wrote:
> Interesting:
> http://stackoverflow.com/questions/5490824/should-constructors-comply-with-the-liskov-substitution-principle
>
Let me humbly conjecture that the people who wrote the top answers have
background in less capable languages than Python.
Not every language allows you to call self.__class__(). In the languages
that don't you can get away with incompatible constructor signatures.
However, let me try to focus the discussion on a specific issue before we
go deep into OOP theory.
With python's standard datetime.date we have:
>>> from datetime import *
>>> class Date(date):
... pass
...
>>> Date.today()
Date(2015, 2, 13)
>>> Date.fromordinal(1)
Date(1, 1, 1)
Both .today() and .fromordinal(1) will break in a subclass that redefines
__new__ as follows:
>>> class Date2(date):
... def __new__(cls, ymd):
... return date.__new__(cls, *ymd)
...
>>> Date2.today()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: __new__() takes 2 positional arguments but 4 were given
>>> Date2.fromordinal(1)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: __new__() takes 2 positional arguments but 4 were given
Why is this acceptable, but we have to sacrifice the convenience of having
Date + timedelta
return Date to make it work with Date2:
>>> Date2((1,1,1)) + timedelta(1)
datetime.date(1, 1, 2)
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to