how to get derived class name from base class

Sadiksha Gautam picture Sadiksha Gautam · Jul 10, 2012 · Viewed 31k times · Source

I have a base class Person and derived classes Manager and Employee. Now, what I would like to know is the object created is Manager or the Employee.

The person is given as belows:

from Project.CMFCore.utils import getToolByName
schema = getattr(Person, 'schema', Schema(())).copy() + Schema((TextField('FirstName', required = True, widget = StringWidget(label='First Name', i18n_domain='project')), TextField('Last Name', required = True, widget = StringWidget(label='Last Name', i18n_domain='i5', label_msgid='label_pub_city'))
class Manager(BaseContent):
  def get_name(self):
    catalog = getToolByName(self, "portal_catalog")
      people = catalog(portal_type='Person')
      person={}
      for object in people:
        fname = object.firstName
        lname = object.lastName
        person['name'] = fname+' '+ lname
        # if the derived class is Employee then i would like go to the method title of employee and if its a Manager then go to the title method of Manager
        person['post'] = Employee/Manager.title()
      return person

For Manager and employees they are like (employee is also similar but some different methods)

from Project.Person import Person
class Manager(Person):
    def title(self):
      return "Manager"

For Employee the title is 'Employee'. When I create a Person it is either Manager or the Employee. When I get the person object the class is Person but I would like to know whether it is from the derived class 'Manager' or 'Employee'.

Answer

Emmanuel picture Emmanuel · Jul 10, 2012

I don't know if this is what you want, and the way you'd like it implemented, but here's a try:

>>> class Person(object):
    def _type(self):
        return self.__class__.__name__


>>> p = Person()
>>> p._type()
'Person'
>>> class Manager(Person):
    pass

>>> m = Manager()
>>> m._type()
'Manager'
>>> 

Pros: only one definition of the _type method.