2017-05-17 12 views
9

द्वारा विरासत में प्राप्त सभी विशेषताओं की सूची हाय मेरे पास नीचे है जिसमें से मैं StackOverflow पर प्राप्त कोड का उपयोग कर Outlook से डेटा खींचने की कोशिश कर रहा हूं।कक्षा

पहले पाश का उपयोग करके, मैं ऑब्जेक्ट पर उपलब्ध सभी विशेषताओं को इकट्ठा करने की कोशिश कर रहा हूं।

इसे चलाने के दौरान मुझे नाम की अनुपस्थिति दिखाई देती है जिसे बाद में दूसरे लूप में बुलाया जाता है, मुझे लगता है कि यह विरासत के कारण है। कृपया कक्षा में उपलब्ध सभी विशेषताओं को खोजने में मेरी सहायता कर सकते हैं?

import win32com.client,sys 

o = win32com.client.gencache.EnsureDispatch("Outlook.Application") 
ns = o.GetNamespace("MAPI") 

adrLi = ns.AddressLists.Item("Global Address List") 
contacts = adrLi.AddressEntries 
numEntries = adrLi.AddressEntries.Count 
print(type(contacts)) 
nameAliasDict = {} 
attrs_ = dir(contacts) 
for i in range(len(attrs_)): 
    print((attrs_[i])) 

for j in contacts: 
    print(j.Name) 

    sys.exit() 
+0

http://stackoverflow.com/questions/4241171/inspect-python-class-attributes नोट ऑब्जेक्ट विशेषताएँ भिन्न हो सकती हैं – Serge

+1

आवश्यक रूप से विरासत नहीं; नामों का सेट जिसके लिए विशेषता लुकअप सफल होता है, अनिवार्य रूप से स्पष्ट रूप से परिभाषित नहीं किया जाता है। एकमात्र चीज जो आप निश्चित रूप से कह सकते हैं वह यह है कि 'foo' के लिए एक विशेषता' x' उपलब्ध है यदि 'foo.x'' AttributeError 'नहीं बढ़ाता है। – chepner

उत्तर

3

का प्रयोग करें super और dir बिल्ट-इन कार्य।

super मातृभाषा के उदाहरण को संदर्भित करता है।

वापसी एक प्रॉक्सी उद्देश्य यह है कि प्रतिनिधियों विधि प्रकार के माता-पिता या भाई वर्ग के लिए कहता है। यह विरासत में प्राप्त विधियों तक पहुंचने के लिए उपयोगी है जो कक्षा में ओवरराइड किए गए हैं।

dir तर्क की विशेषताओं की सूची देता है।

एक तर्क के साथ, उस ऑब्जेक्ट के लिए मान्य विशेषताओं की सूची वापस करने का प्रयास करें।

class Foo: 
    def __init__(self): 
     self.v = 10 

class Bar(Foo): 
    def __init__(self): 
     super().__init__() 
     print(dir(super())) 

b = Bar() 

आउटपुट:

[(...), 'v'] 

उत्पादन सूची सभी विशेषताओं है कि माँ कक्षा में परिभाषित कर रहे हैं शामिल हैं। इसमें ज्यादातर object (डबल अंडरस्कोर के बीच विशेषताओं) से प्राप्त गुण शामिल हैं।


आप वर्ग जिसका आप गुण जानना चाहते हैं, तो बस एक उदाहरण पर dir का उपयोग का विस्तार नहीं करते:

>>> dir(Foo()) 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'v'] 
+0

'डीआईआर (सुपर()) 'ऐसा नहीं करता जो आपको लगता है कि यह करता है। उदाहरण के लिए, यदि 'v'' को 'Foo' के बजाय 'बार' में परिभाषित किया गया था, तो यह अभी भी आउटपुट में दिखाई देगा। इसके अलावा, 'डीआईआर (सुपर())' विरासत विधियों, या किसी भी वस्तु के तरीकों को नहीं दिखाएगा; 'डीआईआर (सुपर()) द्वारा दिखाए गए तरीकों' पूरी तरह से असंबंधित सूची हैं, जो 'सुपर' के वर्ग पदानुक्रम से आती हैं। – user2357112

4

dir(contacts) आप contacts के सभी विशेषता नाम दिखाई देगा।

मैं नाम के अभाव जो बाद में 2 पाश

में कहा जाता है पर ध्यान देने पर j.Name नहीं contacts.Name तो वहाँ Name के लिए कोई कारण नहीं है पहले पाश से दिखाने के लिए है का उपयोग करें। यदि आप j पर सभी उपलब्ध विशेषताओं को जानना चाहते हैं तो dir(j) करें।

1

दो वर्गों, जनक एवं बाल, यदि आप केवल विरासत में मिला गुण चाहते हैं आप inspect मॉड्यूल dir के साथ मिलकर इस्तेमाल कर सकते हैं को देखते हुए:

import inspect 

class Parent(): 
    a = 1 

    def myfunc(self): 
     return 2 

class Child(Parent): 

    c = 4 


mros = inspect.getmro(Child) #returns a tuple with the class in parameter at the first position, the rest should be the parent class(es) 
child_attrs = dir(mros[0]) 
parent_attrs = dir(mros[1]) 

inherited_attr = [item for item in child_attrs if item in parent_attrs] 

print(parent_attrs) 
print(child_attrs) 
print(inherited_attr) 

और तुम भी आप चाहें

पदानुक्रम में इस तरह जा सकते हैं
5

पायथन एक आसान छोटे बिल्टिन प्रदान करता है जिसे डीआईआर कहा जाता है।मैं एक वर्ग उदाहरण पर उपयोग कर सकते हैं कि सभी विशेषताओं और कुछ विरासत में मिला जादू तरीकों के साथ-साथ उस वर्ग के तरीकों में से एक सूची प्राप्त करने __delattr__, रूप में इस तरह, __dict__, __doc__, __format__, आदि आप स्वयं इस निम्न कार्य करके की कोशिश कर सकते हैं:

x = dir(myClassInstance) 

लेकिन क्या आप चाहते हैं:

child.__class__.__bases__[0]().getAttributes() 

__bases__ एक वर्ग इस वर्ग के लिए आधार वर्ग के टपल युक्त विशेषता है। इसलिए यदि आपकी कक्षा में केवल एक बेस क्लास है, तो यह उत्तर है, लेकिन यदि कक्षा में एक से अधिक बेस क्लास हैं, तो बस उस टुपल के सभी तत्वों के लिए ऐसा ही करें।

+1

विधि 'getAttributes()' कहां से आती है? –