如何从基类中获取派生类名

2024-06-08 04:41:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基类Person和派生类ManagerEmployee。现在,我想知道的是创建的对象是ManagerEmployee

此人如下:

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

对于经理和员工来说,他们是一样的(员工也很相似,但有一些不同的方法)

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

对于Employee,标题是“Employee”。当我创建一个Person时,它要么是Manager,要么是Employee。当我得到person对象时,类是person,但我想知道它是来自派生类“Manager”还是“Employee”。


Tags: the对象namefromselfobjecttitleemployee
3条回答

我不知道这是否是你想要的,以及你希望它实现的方式,但这里有一个尝试:

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


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

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

优点:只有一个_type方法的定义。

我不完全确定我是否理解您的要求,但是您可以使用x.__class__.__name__将类名作为字符串检索,例如

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

或者,可以使用isinstance检查不同类型:

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

所以你可以这样做:

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"

Python对象提供一个__class__属性,该属性存储用于生成该对象的类型。这依次提供了一个__name__属性,该属性可用于以字符串形式获取类型的名称。所以,简单来说:

class A(object):
    pass
class B(A):
    pass

b = B()
print b.__class__.__name__

会给出:

'B'

所以,如果我正确地回答了你的问题,你就会:

m = Manager()
print m.__class__.__name__
'Manager'

相关问题 更多 >

    热门问题