[英]how to get derived class name from base class
我有一个基类Person
和派生类Manager
和Employee
。 现在,我想知道创建的对象是Manager
还是Employee
。
此人如下:
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
对于Manager和employee来说是一样的(employee也是相似的,只是方法不同)
from Project.Person import Person
class Manager(Person):
def title(self):
return "Manager"
对于员工,标题是“员工”。 当我创建一个Person
它是Manager
或Employee
。 当我获得 person 对象时,该类是 Person 但我想知道它是来自派生类“Manager”还是“Employee”。
我不知道这是否是您想要的,以及您希望它的实现方式,但可以尝试一下:
>>> 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'
你会寻找这样的东西吗?
>>> 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
“做这个”最好的办法就是不做。 相反,在 Person 上创建在 Manager 或 Employee 上覆盖的方法,或者为子类提供扩展基类的自己的方法。
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"
如果您发现自己需要在基类中知道正在实例化哪个子类,则您的程序可能存在设计错误。 如果其他人后来扩展 Person 以添加一个名为 Contractor 的新子类,您会怎么做? 当子类不是它所知道的任何硬编码替代方案时,Person 会做什么?
在您的示例中,您不需要知道该类,您只需通过引用类实例来调用该方法:
# 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()
但是不要使用object
作为变量名,你隐藏了内置名称。
Python 类具有__subclasses__
魔术方法,可用于查看当前和从给定父类派生的范围内类。
# related.py
class Parent: ...
class Child(Parent): ...
>>> from related import Parent
>>> Parent.__subclasses__()
[<class 'related.Child'>]
在访问Parent
类时,这些类是对任何范围内派生类的弱引用。
# not_related.py
class StepChild(Parent): ...
>>> from related import Parent
>>> Parent.__subclasses__()
[<class '__main__.Child'>]
>>> from not_related import StepChild
>>> Parent.__subclasses__()
[<class 'related.Child'>, <class 'not_related.StepChild'>]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.