(original) (raw)
On 14 Feb 2015 08:57, "Alexander Belopolsky" <alexander.belopolsky@gmail.com> wrote:
\>
\>
\> On Fri, Feb 13, 2015 at 4:44 PM, Neil Girdhar <mistersheik@gmail.com> 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 "", line 1, in
\> TypeError: \_\_new\_\_() takes 2 positional arguments but 4 were given
\> >>> Date2.fromordinal(1)
\> Traceback (most recent call last):
\> File "", line 1, in
\> 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)
Coupling alternative constructors to the default constructor signature is pretty normal - it just means that if you override the signature of the default constructor, you may need to update the alternative ones accordingly.
Cheers,
Nick.
>
\>
\>
\> \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
\> Python-Dev mailing list
\> Python-Dev@python.org
\> https://mail.python.org/mailman/listinfo/python-dev
\> Unsubscribe: https://mail.python.org/mailman/options/python-dev/ncoghlan%40gmail.com
\>