Nigel Rowe wrote:
I have two modules, both define the same set of classes (with differing
implementations) and a number of utility functions that use those classes.

The utility functions are identical (the differences I need are abstracted
in the classes), so they are cut'n'pasted into both files.

A simplified concrete example (not what I'm doing, but it illustrates the
point):

-- C.py --
|class Comment:
|    def __init__(self, value):
|        self.value = value
|
|    def __str__(self):
|        return "/* " + self.value + " */"
|
|# utility functions
|import time
|def stamp():
|    return Comment(time.asctime())


-- P.py -- |class Comment: | def __init__(self, value): | self.value = value | | def __str__(self): | return "# " + self.value + "\n" | |# utility functions |import time |def stamp(): | return Comment(time.asctime())


How can I refactor these modules to avoid the code duplication?

You could make stamp() a classmethod of a common base class like this:

# CommentBase.py
import time

class CommentBase(object):
    def stamp(cls):  # cls will be one of the Comment implementations
        return cls(time.asctime())

    stamp = classmethod(stamp)

# C.py
from CommentBase import CommentBase
class Comment(CommentBase):
    def __init__(self, value):
        self.value = value


# Client code from C import Comment

c = Comment.stamp()  # This becomes CommentBase.stamp(Comment)
print type(c), c.value


Kent

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to