Polymoprhism question

Discussion in 'Python' started by RVic, May 24, 2013.

  1. RVic

    RVic Guest

    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, youwould 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
     
    RVic, May 24, 2013
    #1
    1. Advertising

  2. 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
     
    Steven D'Aprano, May 24, 2013
    #2
    1. Advertising

  3. RVic

    RVic Guest

    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()
     
    RVic, May 24, 2013
    #3
  4. RVic

    Neil Cerutti Guest

    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
     
    Neil Cerutti, May 24, 2013
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. sean
    Replies:
    1
    Views:
    621
    Cowboy \(Gregory A. Beamer\)
    Oct 20, 2003
  2. =?Utf-8?B?UnlhbiBTbWl0aA==?=

    Quick Question - Newby Question

    =?Utf-8?B?UnlhbiBTbWl0aA==?=, Feb 14, 2005, in forum: ASP .Net
    Replies:
    4
    Views:
    693
    Iain Norman
    Feb 16, 2005
  3. =?Utf-8?B?YW5kcmV3MDA3?=

    question row filter (more of sql query question)

    =?Utf-8?B?YW5kcmV3MDA3?=, Oct 5, 2005, in forum: ASP .Net
    Replies:
    2
    Views:
    971
    Scott Allen
    Oct 6, 2005
  4. Philip Meyer
    Replies:
    0
    Views:
    442
    Philip Meyer
    Nov 30, 2003
  5. Bit Byte
    Replies:
    1
    Views:
    875
    Teemu Keiski
    Jan 28, 2007
Loading...

Share This Page