title: Python - Getting subclass from input. Do I have to write a separate function?
body: <p>I'm working in Python 2.7.8.  What follows is a slight variant of the problem I'm working on.</p>
  
  <p>I have a large number of custom classes that I've written where the inheritance is like a tree.  The behavior is well encapsulated by the following example:</p>
  
  <pre><code>import random
  
  class Animal(object):
      def __init__(self, name):
          self.name = name
          self.can_own_pets = False #most Animals cannot own pets
          self.get_features()
  
      def give_pet(self, pet):
          if not self.can_own_pets:
              print(self.name+' cannot own a pet!')
          else:
              self.pets.append(pet)
  
      def is_hungry(self):
          return random.choice([True, False])
  
      def get_features(self):
          """
          In some classes, get features will be a function
          that uses self.name to extract features.
          In my problem, the features are extracted
          with regular expressions that are determined by
          by the class.
          """
          pass
  
  class Human(Animal):
      def __init__(self, name):
          super(Human, self).__init__(name)
          self.can_own_pets = True
          self.pets = []
  
  class Dog(Animal):
       def __init__(self, name):
          super(Dog, self).__init__(name)
  
       def bark(self):
           print 'WOOF'
  
       def get_features(self):
           if 'chihuahua' in self.name:
               self.is_annoying = True
           elif 'corgi' in self.name:
               self.adorable = True
  </code></pre>
  
  <p>My program needs to take in a large number of animals and delegate them to the correct classes -- I need the correct attributes and methods.  What I would <em>like</em> to do is modify the Animal constructor so that if the name argument is something like "Finn the Dog" or "Jake the Human", it (the constructor) returns an instance of the class "Dog" or "Human", complete with the appropriate methods and attributes.  Now, I know that I could easily write a function that takes a string and class as arguments, constructs a dictionary where the keys are the names of the subclasses of the given class, looks up the element of the dictionary that is contained in the string, and returns an object of <em>that</em> class.  My question is whether or not there is a way to code this into the Animal class itself, which seems more elegant to me (as well as easier to maintain).</p>