I have such code:
class Base:
def do( self ):
self._member1 = 0
self._member2 = 1
class Derived1(Base):
def do(self):
Base.do(self)
self._member3 = 0
self._member4 = 1
class Derived2(Base):
def do(self):
Base.do(self)
self._member3 = 2
self._member4 = 3
class Derived3(Base):
def do(self):
Base.do(self)
self._member3 = 9
self._member4 = 3
etc. Here is what I’ve done:
class Base(object):
'''Base class.'''
def do(self):
self._member1 = 0
self._member2 = 1
class Derived1(Base): pass
class Derived2(Base): pass
class Derived3(Base): pass
class Derived4(Base): pass
class DerivedFactory(object):
'''Factory to create derived classes.'''
members = \
{
1: (Derived1, 0, 1),
2: (Derived2, 4, 5),
3: (Derived3, 6, 7),
4: (Derived4, 8, 9),
}
def do(self, key=1):
derived = self.members[key][0]()
derived.do() # Perform method from Base
derived._member3 = self.members[key][1]
derived._member4 = self.members[key][2]
print(derived)
print('\t%s' % derived.__dict__)
if __name__ == '__main__':
factory = DerivedFactory()
for key in range(1, 5):
derived = factory.do(key)
However, it is not perfect as you see. I need to declare Derived1, Derived2, etc. Also it seems to be overcomplicated. Do you have any ideas on how to imporve this code? Thanks!
As far as I can tell you are just interested in reducing the duplicated code, here is one option that is equivalent to your top piece of code:
Shorter version suggested by Oren in comments (note that for this to work,
Baseneeds to be a new-style class):And here is a decorator version, since it was asked for in comments:
Another decorator version, that overrides the sub-classes’
doinstead of creating a new type (it also lets you use old-style classes):