Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8637757
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 12, 20262026-06-12T10:33:00+00:00 2026-06-12T10:33:00+00:00

I have such code: class Base: def do( self ): self._member1 = 0 self._member2

  • 0

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!

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-12T10:33:02+00:00Added an answer on June 12, 2026 at 10:33 am

    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:

    class Base:
        def do( self ):
            self._member1 = 0
            self._member2 = 1
    
    def make_do(a, b):
        def do(self):
            Base.do(self)
            self._member3 = a
            self._member4 = b
        return do
    
    class Derived1(Base):
        do = make_do(0, 1)
    
    class Derived2(Base):
        do = make_do(2, 3)
    
    class Derived3(Base):
        do = make_do(9, 3)
    

    Shorter version suggested by Oren in comments (note that for this to work, Base needs to be a new-style class):

    class Base(object):
        def do( self ):
            self._member1 = 0
            self._member2 = 1
    
    def make_do(a, b):
        def do(self):
            Base.do(self)
            self._member3 = a
            self._member4 = b
        return do
    
    def make_derived(name, a, b):
        return type(name, (Base,), {'do': make_do(a,b)})
    
    Derived1 = make_derived('Derived1', 0, 1)
    Derived2 = make_derived('Derived2', 2, 3)
    Derived3 = make_derived('Derived3', 9, 3)
    

    And here is a decorator version, since it was asked for in comments:

    class Base(object):
        def do( self ):
            self._member1 = 0
            self._member2 = 1
    
    def add_do(a, b):
        def do(self):
            Base.do(self)
            self._member3 = a
            self._member4 = b
        def deco(cls):
            return type(cls.__name__, (Base,), {'do': do})
        return deco
    
    @add_do(0, 1)
    class Derived1(Base): pass
    
    @add_do(2, 3)
    class Derived2(Base): pass
    
    @add_do(9, 3)
    class Derived3(Base): pass
    

    Another decorator version, that overrides the sub-classes’ do instead of creating a new type (it also lets you use old-style classes):

    class Base:
        def do( self ):
            self._member1 = 0
            self._member2 = 1
    
    def add_do(a, b):
        def deco(cls):
            original_do = cls.do
            def do(self):
                original_do(self)
                self._member3 = a
                self._member4 = b
            cls.do = do
            return cls
        return deco
    
    @add_do(0, 1)
    class Derived1(Base): pass
    
    @add_do(2, 3)
    class Derived2(Base): pass
    
    @add_do(9, 3)
    class Derived3(Base): pass
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

If I have code such as class CString { int GetLength(); }; bool smaller(CString
If I have the following code: class User < ActiveRecord::Base has_many :problems attr_accessible :email,
From http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/ , code such as class Base { public: virtual void function1() {};
I have a class like the following: class A: def __init__(self, arg1, arg2, arg3):
I'm experementing with Jackson serialization/deserialization. For instance, I have such class: class Base{ String
I have the following code that doesn't compile. class Base { public: virtual ~Base()
I have, for example, such class: class Base { public: void SomeFunc() { std::cout
i have such code (copy paste from wiki). Its multiplication of those big numbers
I have such code: $updateSQL = UPDATE `Rooms` R SET R.Revenue = {$s['Revenue']}, R.Ave_rent
I have such code: <h:inputText id=input value=#{bean.input}> <f:convertNumber /> <rich:ajaxValidator event=onblur /> </h:inputText> I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.