How to set a class inheritance at instance creation?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • glomde

    #1

    How to set a class inheritance at instance creation?

    Hi I wonder if you can set what subclass a class should
    have at instance creation.

    The problem is that I have something like:

    class CoreLang():
    def AssignVar(self, var, value):
    pass

    class Lang1(CoreLang) :
    def AssignVar(self, var, value):
    return var, "=", value

    class Lang2(CoreLang) :
    def AssignVar(self, var, value):
    return var, "<=", value

    class WriteStruct():
    def Generate(self, vars):
    for var in vars:
    print self.AssignVar( )

    The problem is that I want WriteStruct to sometimes be a subclass of
    Lang1 and sometimes
    of Lang2.
    In the above example I could but the Generate Method in CoreLang. But
    in my real
    example I also want to able to subclass WriteStruct to be able to easy
    customize WriteStruct.
    Which I wouldnt be able to do if it was a method in CoreLang.

    So in code I would like to write something like:

    WriteStruct(Lan g1).Generate(va rs)

    Even better would be that if I in the Lang1 class could
    just do WriteStruct().G enerate(vars) and Lang1 class would
    magically make WriteStruct a subclass of itself.


    Cheers,

    /T

  • Ramashish Baranwal

    #2
    Re: How to set a class inheritance at instance creation?

    On May 29, 8:52 pm, glomde <tbr...@yahoo.c omwrote:
    Hi I wonder if you can set what subclass a class should
    have at instance creation.
    >
    The problem is that I have something like:
    >
    class CoreLang():
    def AssignVar(self, var, value):
    pass
    >
    class Lang1(CoreLang) :
    def AssignVar(self, var, value):
    return var, "=", value
    >
    class Lang2(CoreLang) :
    def AssignVar(self, var, value):
    return var, "<=", value
    >
    class WriteStruct():
    def Generate(self, vars):
    for var in vars:
    print self.AssignVar( )
    >
    The problem is that I want WriteStruct to sometimes be a subclass of
    Lang1 and sometimes
    of Lang2.
    In the above example I could but the Generate Method in CoreLang. But
    in my real
    example I also want to able to subclass WriteStruct to be able to easy
    customize WriteStruct.
    Which I wouldnt be able to do if it was a method in CoreLang.
    >
    So in code I would like to write something like:
    >
    WriteStruct(Lan g1).Generate(va rs)
    class WriteStruct:
    def __init__(self, SubClass):
    self._sub = SubClass()
    def Generate(self, vars):
    for var in vars:
    print self._sub.Assig nVar()

    This does what you want but isn't inheritance.
    Even better would be that if I in the Lang1 class could
    just do WriteStruct().G enerate(vars) and Lang1 class would
    magically make WriteStruct a subclass of itself.
    >
    I don't think I understood what you want here.

    Ram

    Comment

    • shandy.b@gmail.com

      #3
      Re: How to set a class inheritance at instance creation?

      Why not just have Lang1 and Lang2 inherit from WriteStruct as well?

      On May 29, 8:52 am, glomde <tbr...@yahoo.c omwrote:
      Hi I wonder if you can set what subclass a class should
      have at instance creation.
      >
      The problem is that I have something like:
      >
      class CoreLang():
      def AssignVar(self, var, value):
      pass
      >
      class Lang1(CoreLang) :
      def AssignVar(self, var, value):
      return var, "=", value
      >
      class Lang2(CoreLang) :
      def AssignVar(self, var, value):
      return var, "<=", value
      >
      class WriteStruct():
      def Generate(self, vars):
      for var in vars:
      print self.AssignVar( )
      >
      The problem is that I want WriteStruct to sometimes be a subclass of
      Lang1 and sometimes
      of Lang2.
      In the above example I could but the Generate Method in CoreLang. But
      in my real
      example I also want to able to subclass WriteStruct to be able to easy
      customize WriteStruct.
      Which I wouldnt be able to do if it was a method in CoreLang.
      >
      So in code I would like to write something like:
      >
      WriteStruct(Lan g1).Generate(va rs)
      >
      Even better would be that if I in the Lang1 class could
      just do WriteStruct().G enerate(vars) and Lang1 class would
      magically make WriteStruct a subclass of itself.
      >
      Cheers,
      >
      /T

      Comment

      • glomde

        #4
        Re: How to set a class inheritance at instance creation?

        On 29 Maj, 19:27, "shand...@gmail .com" <shand...@gmail .comwrote:
        Why not just have Lang1 and Lang2 inherit from WriteStruct as well?
        This wont work I think since if add antoher Class:

        class WriteStruct():

        def func1(self);
        print "Hello2"

        def Generate(self):
        self.func1()

        class WriteStruct2(Wr iteStruct):

        def func1(self);
        print "Hello"

        def Generate(self):
        self.func1()

        Den if Lang1, inherit both WriteStruct and WriteStruct2 I will
        get name clashes.

        In my real code I have very big Generate Method in WriteStruct that
        calls submethods.
        and thes submethods should be overriden by the subclasses. So I cant
        change the name
        on the submethods.
        >
        On May 29, 8:52 am, glomde <tbr...@yahoo.c omwrote:
        >
        Hi I wonder if you can set what subclass a class should
        have at instance creation.
        >
        The problem is that I have something like:
        >
        class CoreLang():
        def AssignVar(self, var, value):
        pass
        >
        class Lang1(CoreLang) :
        def AssignVar(self, var, value):
        return var, "=", value
        >
        class Lang2(CoreLang) :
        def AssignVar(self, var, value):
        return var, "<=", value
        >
        class WriteStruct():
        def Generate(self, vars):
        for var in vars:
        print self.AssignVar( )
        >
        The problem is that I want WriteStruct to sometimes be a subclass of
        Lang1 and sometimes
        of Lang2.
        In the above example I could but the Generate Method in CoreLang. But
        in my real
        example I also want to able to subclass WriteStruct to be able to easy
        customize WriteStruct.
        Which I wouldnt be able to do if it was a method in CoreLang.
        >
        So in code I would like to write something like:
        >
        WriteStruct(Lan g1).Generate(va rs)
        >
        Even better would be that if I in the Lang1 class could
        just do WriteStruct().G enerate(vars) and Lang1 class would
        magically make WriteStruct a subclass of itself.
        >
        Cheers,
        >
        /T

        Comment

        • glomde

          #5
          Re: How to set a class inheritance at instance creation?

          On 29 Maj, 19:20, Ramashish Baranwal <ramashish.li.. .@gmail.com>
          wrote:
          On May 29, 8:52 pm, glomde <tbr...@yahoo.c omwrote:
          >
          >
          >
          Hi I wonder if you can set what subclass a class should
          have at instance creation.
          >
          The problem is that I have something like:
          >
          class CoreLang():
          def AssignVar(self, var, value):
          pass
          >
          class Lang1(CoreLang) :
          def AssignVar(self, var, value):
          return var, "=", value
          >
          class Lang2(CoreLang) :
          def AssignVar(self, var, value):
          return var, "<=", value
          >
          class WriteStruct():
          def Generate(self, vars):
          for var in vars:
          print self.AssignVar( )
          >
          The problem is that I want WriteStruct to sometimes be a subclass of
          Lang1 and sometimes
          of Lang2.
          In the above example I could but the Generate Method in CoreLang. But
          in my real
          example I also want to able to subclass WriteStruct to be able to easy
          customize WriteStruct.
          Which I wouldnt be able to do if it was a method in CoreLang.
          >
          So in code I would like to write something like:
          >
          WriteStruct(Lan g1).Generate(va rs)
          >
          class WriteStruct:
          def __init__(self, SubClass):
          self._sub = SubClass()
          def Generate(self, vars):
          for var in vars:
          print self._sub.Assig nVar()
          >
          This does what you want but isn't inheritance.
          This would work I think. Thanks.
          >
          Even better would be that if I in the Lang1 class could
          just do WriteStruct().G enerate(vars) and Lang1 class would
          magically make WriteStruct a subclass of itself.
          >
          I don't think I understood what you want here.
          >
          I just dont want to pass the class in the instancecreatio n.
          Somhehow in my:

          class Lang1(CoreLang) :

          def Function(self):
          WriteStruct().G enerate()

          Then somehow this WriteStruct should magically know that has been
          instantiated in Lang1.
          But this is not really needed. Just wondered if it was possible.
          Ram

          Comment

          • Ramashish Baranwal

            #6
            Re: How to set a class inheritance at instance creation?

            On May 29, 8:52 pm, glomde <tbr...@yahoo.c omwrote:
            Hi I wonder if you can set what subclass a class should
            have at instance creation.
            >
            The problem is that I have something like:
            >
            class CoreLang():
            def AssignVar(self, var, value):
            pass
            >
            class Lang1(CoreLang) :
            def AssignVar(self, var, value):
            return var, "=", value
            >
            class Lang2(CoreLang) :
            def AssignVar(self, var, value):
            return var, "<=", value
            >
            class WriteStruct():
            def Generate(self, vars):
            for var in vars:
            print self.AssignVar( )
            >
            The problem is that I want WriteStruct to sometimes be a subclass of
            Lang1 and sometimes
            of Lang2.
            In the above example I could but the Generate Method in CoreLang. But
            in my real
            example I also want to able to subclass WriteStruct to be able to easy
            customize WriteStruct.
            Which I wouldnt be able to do if it was a method in CoreLang.
            >
            So in code I would like to write something like:
            >
            WriteStruct(Lan g1).Generate(va rs)
            class WriteStruct:
            def __init__(self, SubClass):
            self._sub = SubClass()
            def Generate(self, vars):
            for var in vars:
            print self._sub.Assig nVar()
            Even better would be that if I in the Lang1 class could
            just do WriteStruct().G enerate(vars) and Lang1 class would
            magically make WriteStruct a subclass of itself.
            >
            I don't think I understood what you want here.

            Ram

            Comment

            • Stargaming

              #7
              Re: How to set a class inheritance at instance creation?

              glomde schrieb:
              Hi I wonder if you can set what subclass a class should
              have at instance creation.
              >
              The problem is that I have something like:
              >
              class CoreLang():
              def AssignVar(self, var, value):
              pass
              >
              class Lang1(CoreLang) :
              def AssignVar(self, var, value):
              return var, "=", value
              >
              class Lang2(CoreLang) :
              def AssignVar(self, var, value):
              return var, "<=", value
              >
              class WriteStruct():
              def Generate(self, vars):
              for var in vars:
              print self.AssignVar( )
              >
              The problem is that I want WriteStruct to sometimes be a subclass of
              Lang1 and sometimes
              of Lang2.
              In the above example I could but the Generate Method in CoreLang. But
              in my real
              example I also want to able to subclass WriteStruct to be able to easy
              customize WriteStruct.
              Which I wouldnt be able to do if it was a method in CoreLang.
              >
              So in code I would like to write something like:
              >
              WriteStruct(Lan g1).Generate(va rs)
              >
              Even better would be that if I in the Lang1 class could
              just do WriteStruct().G enerate(vars) and Lang1 class would
              magically make WriteStruct a subclass of itself.
              >
              >
              Cheers,
              >
              /T
              >
              If you really need to inherit at runtime, you could utilize `type()`.
              >>def foo(self, blah):
              .... print self, blah
              ....
              >>attrs = {'foo': foo}
              >>cls = type('MyCls', (object,), attrs)
              >>cls().foo(4 )
              <__main__.MyC ls object at 0x009E86D04

              Changing ``object`` (the tuple contains all bases) will change the
              parent. But, better stick to previous solutions. :)

              Stargaming

              Comment

              • Steve Holden

                #8
                Re: How to set a class inheritance at instance creation?

                glomde wrote:
                Hi I wonder if you can set what subclass a class should
                have at instance creation.
                >
                The problem is that I have something like:
                >
                class CoreLang():
                def AssignVar(self, var, value):
                pass
                >
                class Lang1(CoreLang) :
                def AssignVar(self, var, value):
                return var, "=", value
                >
                class Lang2(CoreLang) :
                def AssignVar(self, var, value):
                return var, "<=", value
                >
                class WriteStruct():
                def Generate(self, vars):
                for var in vars:
                print self.AssignVar( )
                >
                The problem is that I want WriteStruct to sometimes be a subclass of
                Lang1 and sometimes
                of Lang2.
                In the above example I could but the Generate Method in CoreLang. But
                in my real
                example I also want to able to subclass WriteStruct to be able to easy
                customize WriteStruct.
                Which I wouldnt be able to do if it was a method in CoreLang.
                >
                So in code I would like to write something like:
                >
                WriteStruct(Lan g1).Generate(va rs)
                >
                Even better would be that if I in the Lang1 class could
                just do WriteStruct().G enerate(vars) and Lang1 class would
                magically make WriteStruct a subclass of itself.
                >
                >
                You should rethink your program design.

                It seems that when you create a WriteStruct you should really be passing
                its __init__() method the class that you want it to be a "subclass" of,
                creating an instance of that class, and then using generic delegation to
                that subclass (using a modified __getattr__()) to handle methods that
                aren't found in the WriteStruct.

                I can see there are circumstances in which this might not work, but I
                believe your current ugly intentions reveal a design smell that you
                really need to get rid of if you want a clean program.

                regards
                Steve
                --
                Steve Holden +1 571 484 6266 +1 800 494 3119
                Holden Web LLC/Ltd http://www.holdenweb.com
                Skype: holdenweb http://del.icio.us/steve.holden
                ------------------ Asciimercial ---------------------
                Get on the web: Blog, lens and tag your way to fame!!
                holdenweb.blogs pot.com squidoo.com/pythonology
                tagged items: del.icio.us/steve.holden/python
                All these services currently offer free registration!
                -------------- Thank You for Reading ----------------

                Comment

                • Steve Holden

                  #9
                  Re: How to set a class inheritance at instance creation?

                  glomde wrote:
                  Hi I wonder if you can set what subclass a class should
                  have at instance creation.
                  >
                  The problem is that I have something like:
                  >
                  class CoreLang():
                  def AssignVar(self, var, value):
                  pass
                  >
                  class Lang1(CoreLang) :
                  def AssignVar(self, var, value):
                  return var, "=", value
                  >
                  class Lang2(CoreLang) :
                  def AssignVar(self, var, value):
                  return var, "<=", value
                  >
                  class WriteStruct():
                  def Generate(self, vars):
                  for var in vars:
                  print self.AssignVar( )
                  >
                  The problem is that I want WriteStruct to sometimes be a subclass of
                  Lang1 and sometimes
                  of Lang2.
                  In the above example I could but the Generate Method in CoreLang. But
                  in my real
                  example I also want to able to subclass WriteStruct to be able to easy
                  customize WriteStruct.
                  Which I wouldnt be able to do if it was a method in CoreLang.
                  >
                  So in code I would like to write something like:
                  >
                  WriteStruct(Lan g1).Generate(va rs)
                  >
                  Even better would be that if I in the Lang1 class could
                  just do WriteStruct().G enerate(vars) and Lang1 class would
                  magically make WriteStruct a subclass of itself.
                  >
                  >
                  You should rethink your program design.

                  It seems that when you create a WriteStruct you should really be passing
                  its __init__() method the class that you want it to be a "subclass" of,
                  creating an instance of that class, and then using generic delegation to
                  that subclass (using a modified __getattr__()) to handle methods that
                  aren't found in the WriteStruct.

                  I can see there are circumstances in which this might not work, but I
                  believe your current ugly intentions reveal a design smell that you
                  really need to get rid of if you want a clean program.

                  regards
                  Steve
                  --
                  Steve Holden +1 571 484 6266 +1 800 494 3119
                  Holden Web LLC/Ltd http://www.holdenweb.com
                  Skype: holdenweb http://del.icio.us/steve.holden
                  ------------------ Asciimercial ---------------------
                  Get on the web: Blog, lens and tag your way to fame!!
                  holdenweb.blogs pot.com squidoo.com/pythonology
                  tagged items: del.icio.us/steve.holden/python
                  All these services currently offer free registration!
                  -------------- Thank You for Reading ----------------

                  Comment

                  • glomde

                    #10
                    Re: How to set a class inheritance at instance creation?

                    On 29 Maj, 22:45, Steve Holden <s...@holdenweb .comwrote:
                    glomde wrote:
                    Hi I wonder if you can set what subclass a class should
                    have at instance creation.
                    >
                    The problem is that I have something like:
                    >
                    class CoreLang():
                    def AssignVar(self, var, value):
                    pass
                    >
                    class Lang1(CoreLang) :
                    def AssignVar(self, var, value):
                    return var, "=", value
                    >
                    class Lang2(CoreLang) :
                    def AssignVar(self, var, value):
                    return var, "<=", value
                    >
                    class WriteStruct():
                    def Generate(self, vars):
                    for var in vars:
                    print self.AssignVar( )
                    >
                    The problem is that I want WriteStruct to sometimes be a subclass of
                    Lang1 and sometimes
                    of Lang2.
                    In the above example I could but the Generate Method in CoreLang. But
                    in my real
                    example I also want to able to subclass WriteStruct to be able to easy
                    customize WriteStruct.
                    Which I wouldnt be able to do if it was a method in CoreLang.
                    >
                    So in code I would like to write something like:
                    >
                    WriteStruct(Lan g1).Generate(va rs)
                    >
                    Even better would be that if I in the Lang1 class could
                    just do WriteStruct().G enerate(vars) and Lang1 class would
                    magically make WriteStruct a subclass of itself.
                    >
                    You should rethink your program design.
                    >
                    It seems that when you create a WriteStruct you should really be passing
                    its __init__() method the class that you want it to be a "subclass" of,
                    creating an instance of that class, and then using generic delegation to
                    that subclass (using a modified __getattr__()) to handle methods that
                    aren't found in the WriteStruct.
                    This is what I am going to do. For some reason I got stuck to think
                    I needed to solve it with inheritance.

                    Didnt think of the possibility to modify getattr to make
                    the delegation be much nicer. Thanks for the tip

                    >
                    I can see there are circumstances in which this might not work, but I
                    believe your current ugly intentions reveal a design smell that you
                    really need to get rid of if you want a clean program.
                    >
                    regards
                    Steve
                    --
                    Steve Holden +1 571 484 6266 +1 800 494 3119
                    Holden Web LLC/Ltd http://www.holdenweb.com
                    Skype: holdenweb http://del.icio.us/steve.holden
                    ------------------ Asciimercial ---------------------
                    Get on the web: Blog, lens and tag your way to fame!!
                    holdenweb.blogs pot.com squidoo.com/pythonology
                    tagged items: del.icio.us/steve.holden/python
                    All these services currently offer free registration!
                    -------------- Thank You for Reading ----------------

                    Comment

                    Working...