2012-07-10 44 views
21

私は基本クラスPersonと派生クラスManagerEmployeeを持っています。さて、私が知りたいのは、作成されたオブジェクトがManagerまたはEmployeeであることです。基本クラスから派生クラス名を取得する方法

人は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 
マネージャー、彼らは似ている従業員のために

(従業員も同様であるが、いくつかの異なる方法)

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

タイトルは「従業員」であります。 Personを作成すると、ManagerまたはEmployeeのいずれかになります。 Personオブジェクトを取得すると、そのクラスはPersonですが、それが派生クラス 'Manager'か 'Employee'かどうかを知りたいと思います。

+0

あなたは正確に何をしたいのかを示すいくつかのコードを載せることができますか? – SuperSaiyan

答えて

4

あなたが求めていることを理解しているとは確信していませんが、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を使用することができます:Pythonオブジェクトが格納__class__属性を提供し

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" 
6

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

ですから、このような何かを行うことができますそのオブジェクトを作るために使われた型。これは、文字列として型の名前を取得するために使用できる__name__属性を返します。だから、単純なケースで:

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

b = B() 
print b.__class__.__name__ 

与えるだろう:私が正しくあなたの質問に従っている場合

'B'

をだから、あなたはどうなる:私は知りません

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

あなたは正しい質問に答えていると思います。 – yaobin

27

をこれがあなたの望むものであれば、それを実現したいと思う方法ですが、ここで試してみましょう:

>>> 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メソッドの定義は1つだけです。

+0

簡潔です。インタラクティブな出力をうまく利用。 –

+0

多くのありがとう..これは私が探していたものです! –

4

"これを行う"ための最善の方法は、実行しないことです。代わりに、ManagerまたはEmployeeでオーバーライドされたPersonメソッドを作成するか、サブクラスに基本クラスを拡張する独自のメソッドを与えます。

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は何をしますか?

+0

これは「最良の方法」であるか、またはOPに壊れたデザインがあることが疑わしい。 [この回答](http://stackoverflow.com/a/11408458/355230)に示されているように実装する方が簡単です。基本クラスには、すべてのサブクラスが(どのような目的のためにも)使用できるメソッドがあります。 – martineau

0

あなたの例では、クラスを知っている必要はありません、あなただけのクラスのインスタンスを参照してメソッドを呼び出します。

# 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を使用していません名前で。

3

このようなものをお探しですか?

関連する問題