code review
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Fri Jun 29 22:28:52 EDT 2012
On Fri, 29 Jun 2012 19:41:11 +0000, Alister wrote:
> also this section in main strikes me as a bit odd and convoluted
>
> w = world()
> serv = server(client)
> w.server = serv
> serv.world = w
>
> I think you are cross referencing classes & would be better to
> investigate inheritance.
What you show above is composition, and is a perfectly valid technique,
and in fact should often be *preferred* to inheritance.
The only slightly dubious part, and I stress *slightly*, is that there is
a circular reference: w refers to serv, and serv refers back to w. While
legitimate, it is a very slight "code smell" that should be investigated.
If there is a way to get the same result without the circular reference,
that would be preferred.
For example, perhaps server methods that need to know the world could
take it as an explicit argument, rather than fetching it implicitly from
server.world.
Or, a moderately advanced technique, use a weak-ref instead.
Inheritance should only be used to model "is-a" relationships. For
example, Herbie the Love Bug is a Volkswagen Beetle, so inheritance is
appropriate.
http://en.wikipedia.org/wiki/Herbie
class Vehicle(object):
pass
class Car(Vehicle):
pass
class Beetle(Car):
pass
herbie = Beetle()
Composition should be used to model "has-a" relationships. For example, a
car has an engine, it is not a kind of engine, and so inheritance is
inappropriate and composition should be used. I would re-write the Car
class as follows:
class Engine(object):
pass
class Car(Vehicle):
def __init__(self):
self.engine = Engine()
So now we can talk about Herbie's engine:
herbie.engine # Herbie, being a car, has an engine, he is not an engine
--
Steven
More information about the Python-list
mailing list