2012-07-10 19 views
21

से व्युत्पन्न कक्षा का नाम कैसे प्राप्त करें मेरे पास बेस क्लास Person है और कक्षाएं Manager और Employee प्राप्त हुई हैं। अब, मैं क्या जानना चाहता हूं कि बनाई गई वस्तु 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 है। जब मैं व्यक्ति को ऑब्जेक्ट प्राप्त करता हूं तो वह व्यक्ति होता है लेकिन मैं जानना चाहता हूं कि यह व्युत्पन्न वर्ग 'प्रबंधक' या 'कर्मचारी' से है या नहीं।

+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 इस्तेमाल कर सकते हैं:

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

पायथन वस्तुओं एक __class__ विशेषता है जो संग्रहीत करता है प्रदान करते हैं:

>>> 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 विधि की केवल एक परिभाषा।

+0

संक्षिप्त। इंटरैक्टिव आउटपुट का अच्छा उपयोग। –

+0

बहुत धन्यवाद .. यह वही है जो मैं ढूंढ रहा था! –

4

"ऐसा करने" का सबसे अच्छा तरीका यह नहीं करना है। इसके बजाए, प्रबंधक या कर्मचारी पर ओवरराइड किए गए व्यक्ति पर विधियां बनाएं, या उप-वर्गों को अपनी खुद की विधियों को प्रदान करें जो बेस क्लास का विस्तार करते हैं।

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" 

आप पाते हैं अपने आप को आधार वर्ग जो उपवर्ग instantiated किया जा रहा है में पता करने के लिए की आवश्यकता होगी, तो कृपया अपने कार्यक्रम शायद एक डिजाइन त्रुटि है। अगर आप किसी और ने ठेकेदार नामक एक नया सबक्लास जोड़ने के लिए व्यक्ति को विस्तारित किया है तो आप क्या करेंगे? व्यक्ति क्या करेगा जब सबक्लास किसी भी कठोर कोड वाले विकल्पों में से कोई नहीं जानता है?

+0

संदेह यह "सबसे अच्छा तरीका" है या ओपी के पास एक टूटा हुआ डिज़ाइन है। [इस उत्तर] में दिखाए गए अनुसार लागू करने के लिए सरल (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

क्या आप इस तरह कुछ ढूंढ रहे हैं?

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^