Re: [Python-Dev] Confirming status of new modules in 3.4

2014-03-16 Thread Charles-François Natali
2014-03-15 21:44 GMT+00:00 Nikolaus Rath nikol...@rath.org:

 Guido van Rossum gu...@python.org writes:
  This downside of using subclassing as an API should be well known by now
  and widely warned against.

 It wasn't known to me until now. Are these downsides described in some
 more detail somewhere?


The short version is: inheritance breaks encapsulation.

As a trivial and stupid example, let's say you need a list object which
counts the number of items inserted/removed (it's completely stupid, but
that's not the point :-):

So you might do something like:

class CountingList(list):

[...]

def append(self, e):
self.inserted += 1
return super().append(e)

def extend(self, l):
self.inserted += len(l)
return super().extend(l)



Looks fine, it would probably work.

Now, it's actually very fragile: imagine what would happen if list.extend()
was internally implemented by calling list.append() for each element: you'd
end up counting each element twice (since the subclass append() method
would be called).

And that's the problem: by deriving from a class, you become dependent of
its implementation, even though you're using its public API. Which means
that it could work with e.g. CPython but not Pypy, or break with a new
version of Python.

Another related problem is, as Guido explained, that if you add a new
method in the subclass, and the parent class gains a method with the same
name in a new version, you're in trouble.

That's why advising inheritance as a silver bullet for code reuses is IMO
one of the biggest mistakes in OOP, simply because although attractive,
inheritance breaks encapsulation.

As a rule of thumb, you should only use inheritance within a
module/package, or in other words only if you're in control of the
implementation.

The alternative is to use composition

For more details, I highly encourage anyone interested in looking at the
book Effective Java by Joshua Bloch (the example above is inspired by his
book). Although Java-centric, it's packed with many advises, patterns and
anti-patterns that are relevant to OOP and just programming in general
(it's in my top-5 books).

cf
___
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


Re: [Python-Dev] Confirming status of new modules in 3.4

2014-03-16 Thread Nikolaus Rath
Charles-François Natali cf.nat...@gmail.com writes:
 2014-03-15 21:44 GMT+00:00 Nikolaus Rath nikol...@rath.org:

 Guido van Rossum gu...@python.org writes:
  This downside of using subclassing as an API should be well known by now
  and widely warned against.

 It wasn't known to me until now. Are these downsides described in some
 more detail somewhere?


 The short version is: inheritance breaks encapsulation.

 As a trivial and stupid example, let's say you need a list object which
 counts the number of items inserted/removed (it's completely stupid, but
 that's not the point :-):

 So you might do something like:
[...]

Very illuminating example, thanks a lot!


Best,
-Nikolaus

-- 
Encrypted emails preferred.
PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6  02CF A9AD B7F8 AE4E 425C

 »Time flies like an arrow, fruit flies like a Banana.«
___
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