FAQ
I'm trying to figure out (or find an example) of polymorphism whereby I pass a commandline argument (a string) which comports to a class (in java, you would say that it comports to a given interface bu I don't know if there is such a thing in Python) then that class of that name, somehow gets intantiated from that string. This way, I can have similar classes, but have my program use various ones by simply changing the commandline argument.


Can anyone show me how this might be done in Python? Thanks.


-RVic

Search Discussions

  • Steven D'Aprano at May 24, 2013 at 12:10 pm

    On Fri, 24 May 2013 04:40:22 -0700, RVic wrote:


    I'm trying to figure out (or find an example) of polymorphism whereby I
    pass a commandline argument (a string) which comports to a class (in
    java, you would say that it comports to a given interface bu I don't
    know if there is such a thing in Python) then that class of that name,
    somehow gets intantiated from that string. This way, I can have similar
    classes, but have my program use various ones by simply changing the
    commandline argument.

    Can anyone show me how this might be done in Python? Thanks.



    I'm not 100% sure I understand what you want, but my guess is you want
    something like this:




    # A toy class.
    class AClass(object):
         def __init__(self, astring):
             self.astring = astring
         def __repr__(self):
             return "%s(%r)" % (self.__class__.__name__, self.astring)


    # And some variations.
    class BClass(AClass):
         pass


    class CClass(AClass):
         pass




    # Build a dispatch table, mapping the class name to the class itself.
    TABLE = {}
    for cls in (AClass, BClass, CClass):
         TABLE[cls.__name__] = cls




    # Get the name of the class, and an argument, from the command line.
    # Or from the user. Any source of two strings will do.
    # Data validation is left as an exercise.
    import sys
    argv = sys.argv[1:]
    if not argv:
         name = raw_input("Name of the class to use? ")
         arg = raw_input("And the argument to use? ")
         argv = [name, arg]




    # Instantiate.
    instance = TABLE[argv[0]](argv[1])
    print instance




    --
    Steven
  • RVic at May 24, 2013 at 7:19 pm
    Thanks Steven,


    Yes, I see Python isn't going to do this very well, from what I can understand.


    Lets say I have a type of class, and this type of class will always have two methods, in() and out().


    Here is, essentially, what I am trying to do, but I don't know if this will make sense to you or if it is really doable in Python: #thanks, RVic


    import sys
    argv = sys.argv[1:]
    ClassIamInstantiating = argv
    ClassIamInstantiating.in("something")
    x = ClassIamInstantiating.out()
  • Neil Cerutti at May 24, 2013 at 8:23 pm

    On 2013-05-24, RVic wrote:
    Thanks Steven,

    Yes, I see Python isn't going to do this very well, from what I
    can understand.

    Lets say I have a type of class, and this type of class will
    always have two methods, in() and out().

    Here is, essentially, what I am trying to do, but I don't know
    if this will make sense to you or if it is really doable in
    Python: #thanks, RVic

    import sys
    argv = sys.argv[1:]
    ClassIamInstantiating = argv
    ClassIamInstantiating.in("something")
    x = ClassIamInstantiating.out()

    This is pretty easy in Python using the __name__ attribute.


    import sys


    class A:
      def in(self):
        print("A in")
      def out(self):
        print("A out")


    class B:
      def in(self):
        print("B in")
      def out(self):
        print("B out")


    classes = {cls.__name__: cls for cls in (A, B)}


    ArgType = classes[sys.agrv[1]]


    arg = ArgType()


    arg.in("test")
    arg.out("test")


    --
    Neil Cerutti

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedMay 24, '13 at 11:40a
activeMay 24, '13 at 8:23p
posts4
users3
websitepython.org

People

Translate

site design / logo © 2021 Grokbase