how to get derived class name from base class

后端 未结 6 685
既然无缘
既然无缘 2020-12-29 18:35

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

相关标签:
6条回答
  • 2020-12-29 19:10

    Python objects provide a __class__ attribute which stores the type used to make that object. This in turns provides a __name__ attribute which can be used to get the name of the type as a string. So, in the simple case:

    class A(object):
        pass
    class B(A):
        pass
    
    b = B()
    print b.__class__.__name__
    

    Would give:

    'B'

    So, if I follow your question correctly you would do:

    m = Manager()
    print m.__class__.__name__
    'Manager'
    
    0 讨论(0)
  • 2020-12-29 19:16

    In your example you do not need to know the class, you just call the method by referring to the class instance:

    # 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'] = object.title()
    

    But do not use object as a variable name, you hide the built-in name.

    0 讨论(0)
  • 2020-12-29 19:21

    Not exactly sure that I understand what you are asking, but you can use x.__class__.__name__ to retrieve the class name as a string, e.g.

    class Person:
        pass
    
    class Manager(Person):
        pass
    
    class Employee(Person):
        pass
    
    def get_class_name(instance):
        return instance.__class__.__name__
    
    >>> m = Manager()
    >>> print get_class_name(m)
    Manager
    >>> print get_class_name(Employee())
    Employee
    

    Or, you could use isinstance to check for different types:

    >>> print isinstance(m, Person)
    True
    >>> print isinstance(m, Manager)
    True
    >>> print isinstance(m, Employee)
    False
    

    So you could do something like this:

    def handle_person(person):
        if isinstance(person, Manager):
            person.read_paper()     # method of Manager class only
        elif isinstance(person, Employee):
            person.work_hard()      # method of Employee class only
        elif isinstance(person, Person):
            person.blah()           # method of the base class
        else:
            print "Not a person"
    
    0 讨论(0)
  • 2020-12-29 19:25

    The best way to "do this" is to not do it. Instead, create methods on Person that are overridden on Manager or Employee, or give the subclasses their own methods that extend the base class.

    class Person(object):
        def doYourStuff(self):
            print "I'm just a person, I don't have anything to do"
    
    class Manager(object):
        def doYourStuff(self):
            print "I hereby manage you"
    
    class Employee(object):
        def doYourStuff(self):
            print "I work long hours"
    

    If you find yourself needing to know in the base class which subclass is being instantiated, your program probably has a design error. What will you do if someone else later extends Person to add a new subclass called Contractor? What will Person do when the subclass isn't any of the hard-coded alternatives it knows about?

    0 讨论(0)
  • 2020-12-29 19:32

    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.

    0 讨论(0)
  • 2020-12-29 19:32

    Would you be looking for something like this?

    >>> class Employee:
    ...     pass
    ... 
    >>> class Manager(Employee):
    ...     pass
    ... 
    >>> e = Employee()
    >>> m = Manager()
    >>> print e.__class__.__name__
    Employee
    >>> print m.__class__.__name__
    Manager
    >>> e.__class__.__name__ == 'Manager'
    False
    >>> e.__class__.__name__ == 'Employee'
    True
    
    0 讨论(0)
提交回复
热议问题