Sad*_*tam 33 python plone base-class derived-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
Run Code Online (Sandbox Code Playgroud)
对于经理和员工而言,他们就像(员工也很相似,但有些不同的方法)
from Project.Person import Person
class Manager(Person):
def title(self):
return "Manager"
Run Code Online (Sandbox Code Playgroud)
对于员工,标题是"员工".当我创建Person
它时,它Manager
或者是Employee
.当我得到person对象时,该类是Person,但我想知道它是来自派生类'Manager'还是'Employee'.
Emm*_*uel 39
我不知道这是不是你想要的,以及你希望它实现的方式,但这是一个尝试:
>>> class Person(object):
def _type(self):
return self.__class__.__name__
>>> p = Person()
>>> p._type()
'Person'
>>> class Manager(Person):
pass
>>> m = Manager()
>>> m._type()
'Manager'
>>>
Run Code Online (Sandbox Code Playgroud)
优点:该_type
方法只有一个定义.
Python对象提供了一个__class__
属性,用于存储用于生成该对象的类型.这又提供了一个__name__
属性,可用于将类型的名称作为字符串获取.所以,在简单的情况下:
class A(object):
pass
class B(A):
pass
b = B()
print b.__class__.__name__
Run Code Online (Sandbox Code Playgroud)
会给:
'B'
所以,如果我正确地按照你的问题你会做:
m = Manager()
print m.__class__.__name__
'Manager'
Run Code Online (Sandbox Code Playgroud)
你会找这样的东西吗?
>>> 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
Run Code Online (Sandbox Code Playgroud)
不完全确定我理解你在问什么,但你可以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
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用isinstance检查不同类型:
>>> print isinstance(m, Person)
True
>>> print isinstance(m, Manager)
True
>>> print isinstance(m, Employee)
False
Run Code Online (Sandbox Code Playgroud)
所以你可以这样做:
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"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23920 次 |
最近记录: |