On 2015-02-13 00:55, Guido van Rossum wrote:
On Thu, Feb 12, 2015 at 4:36 PM, Ethan Furman <et...@stoneleaf.us
<mailto:et...@stoneleaf.us>> wrote:

    I suspect the last big hurdle to making built-in data structures
    nicely subclassable is the insistence of such types to
    return new instances as the base class instead of the derived class.

    In case that wasn't clear ;)

    --> class MyInt(int):
    ...   def __repr__(self):
    ...     return 'MyInt(%d)' % self
    ...
    --> m = MyInt(42)
    --> m
    MyInt(42)
    --> m + 1
    43
    --> type(m+1)
    <class 'int'>

    Besides the work it would take to rectify this, I imagine the
    biggest hurdle would be the performance hit in always
    looking up the type of self.  Has anyone done any preliminary
    benchmarking?  Are there other concerns?


Actually, the problem is that the base class (e.g. int) doesn't know how
to construct an instance of the subclass -- there is no reason (in
general) why the signature of a subclass constructor should match the
base class constructor, and it often doesn't.

> So this is pretty much a no-go. It's not unique to Python -- it's a
> basic issue with OO.
>
Really?


>>> class BaseInt:
...     def __init__(self, value):
...         self._value = value
...     def __add__(self, other):
...         return type(self)(self._value + other)
...     def __repr__(self):
...         return '%s(%s)' % (type(self), self._value)
...
>>> class MyInt(BaseInt):
...     pass
...
>>>
>>> m = BaseInt(42)
>>> m
<class '__main__.BaseInt'>(42)
>>> m + 1
<class '__main__.BaseInt'>(43)
>>> type(m + 1)
<class '__main__.BaseInt'>
>>>
>>> m = MyInt(42)
>>> m
<class '__main__.MyInt'>(42)
>>> m + 1
<class '__main__.MyInt'>(43)
>>> type(m + 1)
<class '__main__.MyInt'>
>>>

_______________________________________________
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/archive%40mail-archive.com

Reply via email to