Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Polymoprhism question

13 views
Skip to first unread message

RVic

unread,
May 24, 2013, 7:40:22 AM5/24/13
to
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

Steven D'Aprano

unread,
May 24, 2013, 8:10:16 AM5/24/13
to
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

unread,
May 24, 2013, 3:19:20 PM5/24/13
to
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

unread,
May 24, 2013, 4:23:48 PM5/24/13
to
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
0 new messages