पायथन ऑब्जेक्ट में कौन सी विधियाँ हैं, यह खोजना


427

किसी भी प्रकार के पायथन ऑब्जेक्ट को देखते हुए, क्या इस ऑब्जेक्ट की सभी विधियों की सूची प्राप्त करने का एक आसान तरीका है?

या,

यदि यह संभव नहीं है, तो क्या यह जांचने का कम से कम एक आसान तरीका है कि क्या यह एक विशेष विधि है, केवल जाँच के अलावा अगर कोई त्रुटि तब होती है जब विधि कहा जाता है?


जवाबों:


521

कई वस्तुओं के लिए , आप इस कोड का उपयोग कर सकते हैं, जिसमें आप जिस वस्तु में रुचि रखते हैं उसके साथ 'ऑब्जेक्ट' की जगह ले सकते हैं:

object_methods = [method_name for method_name in dir(object)
                  if callable(getattr(object, method_name))]

मैंने इसे diveintopython.net (अब संग्रहीत) में खोजा । उम्मीद है, कि कुछ और विस्तार प्रदान करना चाहिए!

यदि आपको एक मिलता है AttributeError, तो आप इसके बजाय इसका उपयोग कर सकते हैं :

getattr(पांडा शैली python3.6 सार आभासी उप-कक्षाओं के असहिष्णु है। यह कोड ऊपर जैसा ही है और अपवादों की उपेक्षा करता है।

import pandas as pd 
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],  
                  columns=['foo', 'bar', 'baz']) 
def get_methods(object, spacing=20): 
  methodList = [] 
  for method_name in dir(object): 
    try: 
        if callable(getattr(object, method_name)): 
            methodList.append(str(method_name)) 
    except: 
        methodList.append(str(method_name)) 
  processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s) 
  for method in methodList: 
    try: 
        print(str(method.ljust(spacing)) + ' ' + 
              processFunc(str(getattr(object, method).__doc__)[0:90])) 
    except: 
        print(method.ljust(spacing) + ' ' + ' getattr() failed') 


get_methods(df['foo']) 

3
यह एक सूची की समझ है, उन तरीकों की एक सूची लौटाता है जहाँ विधि dir (ऑब्जेक्ट) द्वारा लौटी सूची में एक आइटम है, और जहाँ प्रत्येक विधि को सूची में जोड़ा जाता है केवल अगर getattr (ऑब्जेक्ट, विधि) एक कॉल करने योग्य देता है।
मनेबुर्को

1
आप इसका उपयोग कैसे करते हैं? कहने के लिए विधियों की एक सूची प्रिंट करें।
मार्श

12
@ मार्श तरीके मुद्रित करने के लिए print [method for method in dir(object) if callable(getattr(object, method))]:।
ओरेंटेनरिक्स

1
AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'जब मैं इसे चलाने की कोशिश कर रहा हूं, तो मुझे मिल रहा है। पर विवरण देखें stackoverflow.com/q/54713287/9677043
कार्ल बेकर

1
अजगर 3.6 में पांडा डेटाफ्रेम ऑब्जेक्ट के लिए काम नहीं करता है।
स्टीफन कार्ल्ससन

226

dir()एक मॉड्यूल में सभी विशेषताओं की सूची प्राप्त करने के लिए आप अंतर्निहित फ़ंक्शन का उपयोग कर सकते हैं । यह कैसे काम करता है यह देखने के लिए कमांड लाइन पर यह कोशिश करें।

>>> import moduleName
>>> dir(moduleName)

इसके अलावा, आप का उपयोग कर सकते हैं hasattr(module_name, "attr_name") पता लगाने के फ़ंक्शन का क्या किसी मॉड्यूल में एक विशिष्ट विशेषता है।

देखें गाइड अजगर को आत्मनिरीक्षण अधिक जानकारी के लिए।


hasattrयह जानने में मेरे उपयोग के मामले में मदद मिली कि क्या पायथन ऑब्जेक्ट में विशेष सदस्य चर या विधि है।
अक्षय

मुझे यकीन नहीं है कि इस समाधान को पर्याप्त रूप से उखाड़ा नहीं गया है। यह ट्रिक और सटीक है।
प्रसाद राघवेंद्र

93

उपयोग करने के लिए सबसे सरल विधि है dir(objectname)। यह उस वस्तु के लिए उपलब्ध सभी विधियों को प्रदर्शित करेगा। शांत चाल।


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

हाँ। माना। लेकिन, मैं केवल तरीकों की सूची प्राप्त करने के लिए किसी अन्य तकनीक से अवगत नहीं हूं। हो सकता है कि सबसे अच्छा विचार यह है कि दोनों विशेषताओं और विधियों की सूची प्राप्त करें और फिर इसे आगे फ़िल्टर करने के लिए <hasattr (ऑब्जेक्ट, "method_name"> का उपयोग करें?
पवन कुमार

1
@neuronet, मैं स्वीकृत उत्तर को चलाने की कोशिश कर रहा हूं, लेकिन ए AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'। कोई विचार? पर deets देखें stackoverflow.com/q/54713287/9677043 । +1 से @Pawan कुमार b / c उत्तर कार्य करता है, और @ljs को सिर्फ तरीकों की फ़िल्टर की गई सूची के वादे के लिए।
कार्ल बेकर

30

यह जाँचने के लिए कि क्या इसकी कोई विशेष विधि है:

hasattr(object,"method")

14
चूंकि ओपी एक विधि की तलाश में है, न कि सिर्फ और if hasattr(obj,method) and callable(getattr(obj,method)):
खासियत के

28

मेरा मानना ​​है कि आप जो चाहते हैं वह कुछ इस तरह है:

किसी वस्तु से विशेषताओं की सूची

मेरी विनम्र राय में, अंतर्निहित फ़ंक्शन dir()आपके लिए यह काम कर सकता है। help(dir)अपने पायथन शेल पर आउटपुट से लिया गया :

dir (...)

dir([object]) -> list of strings

यदि एक तर्क के बिना कहा जाता है, तो मौजूदा दायरे में नाम वापस करें।

एल्स, दिए गए ऑब्जेक्ट की विशेषताओं (और कुछ) में शामिल नामों की वर्णमाला सूची लौटाएं, और इसमें से उपलब्ध विशेषताएँ।

यदि ऑब्जेक्ट नाम की एक विधि की आपूर्ति करता है __dir__, तो इसका उपयोग किया जाएगा; अन्यथा डिफ़ॉल्ट dir () तर्क का उपयोग किया जाता है और वापस आता है:

  • मॉड्यूल ऑब्जेक्ट के लिए: मॉड्यूल की विशेषताएँ।
  • एक वर्ग वस्तु के लिए: इसकी विशेषताएँ, और इसके आधारों के पुनरावर्ती गुण।
  • किसी भी अन्य वस्तु के लिए: इसकी विशेषताएँ, इसकी कक्षा की विशेषताएँ और इसके वर्ग के आधार वर्गों की पुनरावृत्ति की विशेषताएँ।

उदाहरण के लिए:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> a = "I am a string"
>>>
>>> type(a)
<class 'str'>
>>>
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']

जैसा कि मैं आपके मुद्दे की जाँच कर रहा था, मैंने अपने विचार को प्रदर्शित करने का निर्णय लिया, जिसके आउटपुट का एक बेहतर प्रारूपण था dir()

dir_attributes.py (पायथन 2.7.6)

#!/usr/bin/python
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print "\nObject Data: %s" % obj
print "Object Type: %s\n" % type(obj)

for method in dir(obj):
    # the comma at the end of the print, makes it printing 
    # in the same line, 4 times (count)
    print "| {0: <20}".format(method),
    count += 1
    if count == 4:
        count = 0
        print

dir_attributes.py (Python 3.4.3)

#!/usr/bin/python3
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print("\nObject Data: ", obj)
print("Object Type: ", type(obj),"\n")

for method in dir(obj):
    # the end=" " at the end of the print statement, 
    # makes it printing in the same line, 4 times (count)
    print("|    {:20}".format(method), end=" ")
    count += 1
    if count == 4:
        count = 0
        print("")

आशा है कि मैंने योगदान दिया है :)।


1
योगदान किया? तुम्हारे जवाब ने मेरे लिए पाइथन 2.7.12 में काम किया, इसलिए हाँ!
gsamaras

23

यदि मैं iPython का उल्लेख नहीं करता, तो अधिक प्रत्यक्ष उत्तरों के शीर्ष पर, मुझे रिमिस होगा । उपलब्ध तरीकों को देखने के लिए 'टैब' को हिट करें, स्वतः पूर्णता के साथ।

और एक बार जब आप एक विधि पा लें, तो कोशिश करें:

help(object.method) 

pydocs, विधि हस्ताक्षर आदि देखने के लिए।

आह ... REPL


12

यदि आप विशेष रूप से विधियां चाहते हैं , तो आपको निरीक्षण.इस्मैथोड का उपयोग करना चाहिए ।

विधि के नाम के लिए:

import inspect
method_names = [attr for attr in dir(self) if inspect.ismethod(getattr(self, attr))]

खुद के तरीकों के लिए:

import inspect
methods = [member for member in [getattr(self, attr) for attr in dir(self)] if inspect.ismethod(member)]

कभी-कभी inspect.isroutineउपयोगी भी हो सकता है ("बाध्यकारी" संकलक के निर्देश के बिना अंतर्निहित, सी एक्सटेंशन, साइथन के लिए)।


क्या आपको सूची बोध में उपयोग inspect.getmembersकरने के बजाय उपयोग नहीं करना चाहिए dir?
बोरिस

हाँ, यह बेहतर लगता है!
पौलमेलनिकोव

11

ओपन बैश शेल (उबंटू पर ctrl + alt + T)। इसमें पायथन 3 शेल शुरू करें। के तरीकों का निरीक्षण करने के लिए ऑब्जेक्ट बनाएं। बस इसके बाद एक डॉट जोड़ें और दो बार "टैब" दबाएं और आपको कुछ ऐसा दिखाई देगा:

 user@note:~$ python3
 Python 3.4.3 (default, Nov 17 2016, 01:08:31) 
 [GCC 4.8.4] on linux
 Type "help", "copyright", "credits" or "license" for more information.
 >>> import readline
 >>> readline.parse_and_bind("tab: complete")
 >>> s = "Any object. Now it's a string"
 >>> s. # here tab should be pressed twice
 s.__add__(           s.__rmod__(          s.istitle(
 s.__class__(         s.__rmul__(          s.isupper(
 s.__contains__(      s.__setattr__(       s.join(
 s.__delattr__(       s.__sizeof__(        s.ljust(
 s.__dir__(           s.__str__(           s.lower(
 s.__doc__            s.__subclasshook__(  s.lstrip(
 s.__eq__(            s.capitalize(        s.maketrans(
 s.__format__(        s.casefold(          s.partition(
 s.__ge__(            s.center(            s.replace(
 s.__getattribute__(  s.count(             s.rfind(
 s.__getitem__(       s.encode(            s.rindex(
 s.__getnewargs__(    s.endswith(          s.rjust(
 s.__gt__(            s.expandtabs(        s.rpartition(
 s.__hash__(          s.find(              s.rsplit(
 s.__init__(          s.format(            s.rstrip(
 s.__iter__(          s.format_map(        s.split(
 s.__le__(            s.index(             s.splitlines(
 s.__len__(           s.isalnum(           s.startswith(
 s.__lt__(            s.isalpha(           s.strip(
 s.__mod__(           s.isdecimal(         s.swapcase(
 s.__mul__(           s.isdigit(           s.title(
 s.__ne__(            s.isidentifier(      s.translate(
 s.__new__(           s.islower(           s.upper(
 s.__reduce__(        s.isnumeric(         s.zfill(
 s.__reduce_ex__(     s.isprintable(       
 s.__repr__(          s.isspace(           

1
जब हम इस तरह से वर्कअराउंड के बारे में बात कर रहे हैं, तो मैं जोड़ूंगा कि आप भी चला सकते हैं ipython, ऑब्जेक्ट टाइप करना शुरू करें और दबाएं tabऔर यह भी काम करेगा। कोई रीडलाइन सेटिंग्स की जरूरत नहीं है
मैक्स कोपलान

1
@MaxCoplan मैंने उन मामलों के लिए कोड में वर्कअराउंड जोड़ा है जहां टैब-समापन डिफ़ॉल्ट रूप से सक्षम नहीं है
Valery Ramusik

8

यहां बताई गई सभी विधियों के साथ समस्या यह है कि आप सुनिश्चित नहीं हैं कि कोई विधि मौजूद नहीं है।

पायथन में आप डॉट कॉलिंग थ्रू को इंटरसेप्ट कर सकते हैं , __getattr__और __getattribute__"रनटाइम पर" विधि बनाना संभव बना सकते हैं।

उदाहरण के लिए:

class MoreMethod(object):
    def some_method(self, x):
        return x
    def __getattr__(self, *args):
        return lambda x: x*2

यदि आप इसे निष्पादित करते हैं, तो आप ऑब्जेक्ट शब्दकोश में गैर-मौजूदा विधि को कॉल कर सकते हैं ...

>>> o = MoreMethod()
>>> o.some_method(5)
5
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method']
>>> o.i_dont_care_of_the_name(5)
10

और यही कारण है कि आप पाइथन में अनुमति प्रतिमानों की तुलना में माफी मांगने के लिए ईजीयर का उपयोग करते हैं ।


6

किसी भी ऑब्जेक्ट के तरीकों की सूची प्राप्त करने का सबसे सरल तरीका help()कमांड का उपयोग करना है ।

%help(object)

यह उस वस्तु से जुड़े सभी उपलब्ध / महत्वपूर्ण तरीकों को सूचीबद्ध करेगा।

उदाहरण के लिए:

help(str)

%पहले उदाहरण में क्या करता है ? यह मेरे पायथन 2.7 में काम नहीं करता है।
स्कॉर्चियो

@ सोरचियो मैंने अजगर के लिए ">>>" के बजाय "%" का उपयोग किया है। कमांड चलाने से पहले आप% को हटा सकते हैं।
परितोष व्यास


1

कोई ऐसा getAttrsफ़ंक्शन बना सकता है जो किसी ऑब्जेक्ट की कॉल करने योग्य संपत्ति के नाम वापस कर देगा

def getAttrs(object):
  return filter(lambda m: callable(getattr(object, m)), dir(object))

print getAttrs('Foo bar'.split(' '))

वह लौट आएगी

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

1

सभी ऑब्जेक्ट के तरीकों को सूचीबद्ध करने का कोई विश्वसनीय तरीका नहीं है। dir(object)आमतौर पर उपयोगी है, लेकिन कुछ मामलों में यह सभी तरीकों को सूचीबद्ध नहीं कर सकता है। dir()प्रलेखन के अनुसार : "एक तर्क के साथ, उस वस्तु के लिए वैध विशेषताओं की एक सूची वापस करने का प्रयास करें।"

उस विधि की जाँच करना callable(getattr(object, method))पहले से ही बताए अनुसार किया जा सकता है ।


1

ऑब्जेक्ट के रूप में एक सूची लें

obj = []

list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))

आपको मिला:

['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

0

... यह जाँचने का कम से कम एक आसान तरीका है कि क्या यह एक विशेष विधि है, केवल जाँचने के अलावा यदि कोई त्रुटि तब होती है जब विधि कहा जाता है

जबकि " अनुमति की तुलना में माफी मांगने में आसान " निश्चित रूप से पाइथोनिक तरीका है, जिसे आप शायद ढूंढ रहे हैं:

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'

0

पूरे मॉड्यूल में एक विशिष्ट विधि की खोज करने के लिए

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")

-1

यदि आप उदाहरण के लिए, शेल प्लस का उपयोग कर रहे हैं, तो आप इसके बजाय इसका उपयोग कर सकते हैं:

>> MyObject??

इस तरह, '??' के साथ आपकी वस्तु के ठीक बाद, यह आपको उन सभी विशेषताओं / विधियों को दिखाएगा जो कक्षा में हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.