2009-09-04 19 views
9

आप पहले से ही मेरे शब्दावली के उपयोग से पता चला होगा कि मैं एक अजगर n00b हूँ।पायथन खोल के लिए तरीकों की सूची?

सीधे आगे सवाल:

कैसे मैं की तरह एक इंटरैक्टिव अजगर खोल में एक विशेष वस्तु के लिए तरीकों की एक सूची देख सकते हैं मैं रूबी में (आप कर सकते हैं कर सकते हैं कि उसके बाद एक '.methods' के साथ गहरे लाल रंग का आईआरबी में वस्तु)?

उत्तर

17

मौजूदा जवाब आप दिखा कैसे एक वस्तु की विशेषताओं पाने के लिए की एक अच्छा काम करते हैं, लेकिन ठीक सवाल आप उत्पन्न जवाब नहीं - कैसे प्राप्त करने के लिए विधि एक वस्तु का। पायथन वस्तुओं में एक एकीकृत नेमस्पेस होता है (रूबी से अलग, जहां विधियों और विशेषताओं का नाम अलग-अलग नामस्थानों का उपयोग करता है)। उदाहरण के लिए विचार करें:

>>> class X(object): 
... @classmethod 
... def clame(cls): pass 
... @staticmethod 
... def stame(): pass 
... def meth(self): pass 
... def __init__(self): 
...  self.lam = lambda: None 
...  self.val = 23 
... 
>>> x = X() 
>>> dir(x) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'clame', 'lam', 'meth', 'stame', 'val'] 

((आउटपुट पढ़ने योग्यता के लिए विभाजित))।

जैसा कि आप देख, यह आप सभी विशेषताओं के नाम दे रहा है - विशेष तरीकों कि सिर्फ object से लिए गए हैं के बहुत सारे सहित, विशेष डेटा जैसे __class__, __dict__ और __doc__, प्रति-उदाहरण डेटा विशेषताओं विशेषताओं (val) , प्रति-उदाहरण निष्पादन योग्य गुण (lam), साथ ही वास्तविक विधियां।

हैं और जब आप अधिक चयनात्मक होने की जरूरत है, की कोशिश:

>>> import inspect 
>>> [n for n, v in inspect.getmembers(x, inspect.ismethod)] 
['__init__', 'clame', 'meth'] 

स्टैंडर्ड पुस्तकालय मॉड्यूल inspect अजगर में आत्मनिरीक्षण करने का सबसे अच्छा तरीका है: यह की चोटी पर बनाता में निर्मित आत्मनिरीक्षण हुक (जैसे dir और अधिक उन्नत वाले) आपको उपयोगी, समृद्ध और सरल आत्मनिरीक्षण सेवाएं प्रदान करने के लिए। यहां, उदाहरण के लिए, आप देखते हैं कि इस वर्ग द्वारा विशेष रूप से डिज़ाइन किए गए केवल इंस्टेंस और क्लास विधियां दिखायी जाती हैं - स्थैतिक विधियां नहीं, उदाहरण के गुण नहीं, चाहे कॉल करने योग्य हों या नहीं, object से विशेष विधियों को विरासत में नहीं मिला है। यदि आपकी चुनिंदाता की ज़रूरतें थोड़ी अलग हैं, तो ismethod के अपने स्वयं के tweaked संस्करण को बनाना आसान है और परिणामों को अपनी सटीक, सटीक आवश्यकताओं के अनुरूप बनाने के लिए getmembers के दूसरे तर्क के रूप में पास करना आसान है।

8

dir(object)

आप सूची दे देंगे।

उदाहरण के लिए

:

a = 2 
dir(a) 

सभी विधियों का एक पूर्णांक के लिए कॉल कर सकते हैं बंद सूची जाएगा।

+0

काम करता है! धन्यवाद – potlee

5
>>> help(my_object) 
+1

यह वास्तव में सही नहीं है। एक विधि के लिए docstring दस्तावेज प्रदर्शित करने के लिए मदद का उपयोग किया जाता है। जैसे मदद (string.upper)। डीआईआर (ओबीजे) क्या आवश्यक है। – mikej

+0

सही। यदि रूबी में .methods की तरह कुछ आवश्यक है, तो डीआईआर (...) सही जवाब है। –

+0

इंटरैक्टिव उपयोग (ओपी का उपयोग केस) के लिए, यह वास्तव में सबसे अच्छा तरीका है। सहायता प्रणाली 'my_object' के लिए प्रलेखन मुद्रित करेगी, जिसमें सभी विज्ञापित विधियों की एक सूची शामिल है (चाहे वे अपना स्वयं का दस्तावेज़ हो या नहीं)। यह उन नामों के साथ विधियों को नहीं दिखाएगा जो '_' से शुरू होते हैं, लेकिन आमतौर पर यह ठीक है क्योंकि इस तरह के विधियां कक्षा के आंतरिक उपयोग के लिए हैं। – alexis

2

दूसरों dir उल्लेख किया है। मुझे सावधानी बरतने दें: पायथन ऑब्जेक्ट्स में __getattr__ विधि परिभाषित हो सकती है जिसे किसी ऑब्जेक्ट पर एक अपरिभाषित विधि को कॉल करने का प्रयास किया जाता है। जाहिर है dir उन सभी (असीमित कई) विधि नामों की सूची नहीं देता है। कुछ पुस्तकालय इस सुविधा का स्पष्ट उपयोग करते हैं, उदा। PLY (पायथन लेक्स-वाईएसीसी)।

उदाहरण:

>>> class Test: 
...  def __getattr__(self, name): 
...   return 'foo <%s>' % name 
... 
>>> t = Test() 
>>> t.bar 
'foo <bar>' 
>>> 'bar' in dir(t) 
False 
+0

... और प्रश्न से रूबी समानता को लेते हुए, रूबी क्लास ने विधि_missing को ओवरराइड किया हो सकता है जिसे एक अपरिभाषित विधि को कॉल करने का प्रयास किया जाता है और निश्चित रूप से obj.methods को विधि नामों के बारे में नहीं पता हो सकता है method_missing द्वारा संभाला जा सकता है। – mikej

+0

@ माइकज: धन्यवाद! मेरे पास कोई रूबी अनुभव नहीं है, लेकिन जब मैंने अपना जवाब लिखा तो यह मेरे दिमाग को पार कर गया कि रूबी के बराबर कार्यक्षमता होनी चाहिए। – Stephan202

0

आप केवल तरीकों चाहते हैं, तो

def methods(obj): 
    return [attr for attr in dir(obj) if callable(getattr(obj, attr))] 

लेकिन IPython की कोशिश करते हैं, यह टैब पूरा होने वस्तु विशेषताओं के लिए है, तो obj.<tab> टाइपिंग है आप उपलब्ध की एक सूची दिखाता उस वस्तु पर गुण।

+0

निष्क्रिय टैब-पूर्णता के साथ-साथ – SilentGhost

3

dir() के एक उन्नत संस्करण के लिए see() देखें!

>>> test = [1,2,3] 
>>> see(test) 
    [] in + += * *= < <= == != > >= hash() 
    help() iter() len() repr() reversed() str() .append() 
    .count() .extend() .index() .insert() .pop() .remove() 
    .reverse() .sort() 

आप इसे यहाँ प्राप्त कर सकते हैं:

4

अजगर के रूप में टैब पूरा होने का समर्थन करता है कुंआ। मैं अपने पायथन प्रॉम्प्ट को साफ़ करता हूं (इसलिए आईपीथॉन के लिए कोई धन्यवाद नहीं), लेकिन टैब पूर्ण होने के साथ।

.bashrc में सेटअप या इसी तरह की:

PYTHONSTARTUP=$HOME/.pythonrc 

.pythonrc में इस रखो:

try: 
    import readline 
except ImportError: 
    print ("Module readline not available.") 
else: 
    print ("Enabling tab completion") 
    import rlcompleter 
    readline.parse_and_bind("tab: complete") 

यह प्रिंट होगा हर बार अजगर शीघ्र शुरू होता है "टैब पूरा होने को सक्षम करने से", क्योंकि यह बेहतर है स्पष्ट होना यह अजगर स्क्रिप्ट और कार्यक्रमों के निष्पादन में हस्तक्षेप नहीं करेगा।


उदाहरण:

>>> lst = [] 
>>> lst. 
lst.__add__(   lst.__iadd__(   lst.__setattr__(
lst.__class__(  lst.__imul__(   lst.__setitem__(
lst.__contains__(  lst.__init__(   lst.__setslice__(
lst.__delattr__(  lst.__iter__(   lst.__sizeof__(
lst.__delitem__(  lst.__le__(   lst.__str__(
lst.__delslice__(  lst.__len__(   lst.__subclasshook__(
lst.__doc__   lst.__lt__(   lst.append(
lst.__eq__(   lst.__mul__(   lst.count(
lst.__format__(  lst.__ne__(   lst.extend(
lst.__ge__(   lst.__new__(   lst.index(
lst.__getattribute__( lst.__reduce__(  lst.insert(
lst.__getitem__(  lst.__reduce_ex__( lst.pop(
lst.__getslice__(  lst.__repr__(   lst.remove(
lst.__gt__(   lst.__reversed__(  lst.reverse(
lst.__hash__   lst.__rmul__(   lst.sort(
+1

+1 टैब पूर्णता मानक संकेत को और अधिक सुखद बनाता है; मुझे नहीं पता कि यह डिफ़ॉल्ट रूप से क्यों नहीं चल रहा है। यदि आप STARTUP सेट करने से बचना चाहते हैं तो आप कोड को अपनी साइटcustomize.py में भी डाल सकते हैं (हालांकि इस मामले में आप प्रिंट छोड़ देंगे)। ध्यान दें कि विंडोज और मैक उपयोगकर्ताओं के पास डिफ़ॉल्ट रूप से रीडलाइन नहीं होगी और उन्हें उचित मॉड्यूल जैसे कि प्रेडलाइन (विन) या readline.py (मैक) डाउनलोड करने की आवश्यकता होगी। – bobince

+0

साइटcustomize.py के साथ यह पाइथन अनुप्रयोगों को प्रभावित कर सकता है, जबकि .bashrc में PYTHONSTARTUP बनाता है ताकि यह कमांडलाइन से प्रारंभ होने पर केवल रीडलाइन आयात कर सके। यह है कि अगर मैं sitecustomize.py सही ढंग से समझता हूं। – u0b34a0f6ae

+0

यह, हाँ, अगर वे [raw_] इनपुट() का उपयोग करेंगे। यद्यपि यह गड़बड़ की तुलना में आम तौर पर उपयोगी चीज होने की अधिक संभावना है। – bobince

4

इसका सरल आप

dir(object) 

पैदा की है यह वस्तु के सभी विशेषताओं की सूची वापस आ जाएगी किसी भी वस्तु के लिए ऐसा करते हैं।

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