Design Question
Robert Brewer
fumanchu at amor.org
Tue Jan 13 13:02:51 EST 2004
> I have a question which is more about OO design than Python per se.
> I've noticed that a number of posters to this list have very good
> suggestions for SE issues, so I'm hoping that someone will be able to
> give me some guidance.
>
> My question is about how to architect a class hierarchy where some
> methods are nearly identical between a superclass and a subclass, but
> differ slightly. For example:
>
> class Sup(object):
> def __init__(self):
> self.specialFlag = False
> def aMeth(self):
> <do some stuff>
> <if self.specialFlag, do a special thing>
> <do more stuff>
>
> class Sub(Sup):
> def __init__(self):
> self.specialFlag = True
>
> In this example, the method aMeth just checks for specialFlag, and if
> it's True, does the special stuff required.
Since classes in Python are "first class objects" just like instances, I
often modify arrangements like your example to:
class Sup(object):
specialFlag = False
def aMeth(self):
doStuff()
if self.specialFlag:
doSpecialThing()
doMoreStuff()
class Sub(Sup):
specialFlag = True
If you never assign self.specialFlag, it remains a "class attribute"
(that is, since specialFlag is never bound to the instance, it continues
to be looked up in the class dict).
Once you've done *that*, you then see further options. In my designs, I
tend to eliminate such flags, replacing them with the actual behavior
which the flag references:
class Sup(object):
specialThing = []
def aMeth(self):
doStuff()
for eachItem in self.specialThing:
doMoreStuff(eachItem)
class Sub(Sup):
specialThing = [1, 2, 3]
---or---
class Sup(object):
specialThing = lambda x: None
def __init__(self):
self.x = 0
self.y = 0
def aMeth(self):
doStuff()
self.y = self.specialThing(self.x)
doMoreStuff()
class Sub(Sup):
specialThing = lambda x: x[4] + 3
Which one you choose will be dependent upon your design.
Robert Brewer
MIS
Amor Ministries
fumanchu at amor.org
More information about the Python-list
mailing list