> I have a class URI and a bunch of derived sub-classes for example > HttpURI, FtpURI, HttpsURI, etc. (this is an example, I know there is > module urllib & friends, however my actual problem however maps very > well to this example). > > Now I want to pass a string to constructor of URI() and get an instance > of one of the subclasses back. For example uri=URI('http://abcd/...') > will make 'uri' an instance of HttpURI class, not instance of URI. > > To achieve this I have a list of all subclasses of URI and try to > instantiate one by one in URI.__new__(). In the case I pass e.g. FTP URI > to HttpURI constructor it raises ValueError exception and I want to test > HttpsURI, FtpURI, etc.
<snip/> Use a factory function: class UriBase(object): REGISTRY = {} class HttpUri(UriBase): pass UriBase.REGISTRY['http'] = HttpUri def URI(arg): return UriBase.REGISTRY[get_protocol(arg)](arg) This is untested and could be enhanced by e.g. using metaclasses to perform the registration automagicall, but I think you get the idea. Diez -- http://mail.python.org/mailman/listinfo/python-list