পাইথন অবজেক্টের কী পদ্ধতি রয়েছে তা সন্ধান করা হচ্ছে


427

যে কোনও ধরণের পাইথন অবজেক্ট দেওয়া আছে, এই অবজেক্টটিতে রয়েছে এমন সমস্ত পদ্ধতির তালিকা পাওয়ার কী সহজ উপায় আছে?

অথবা,

যদি এটি সম্ভব না হয় তবে পদ্ধতিটি বলা হলে ত্রুটি ঘটে কিনা তা খতিয়ে দেখা ছাড়া এটির কোনও বিশেষ পদ্ধতি আছে কিনা তা পরীক্ষা করার অন্তত কোন সহজ উপায় আছে?


উত্তর:


521

অনেকগুলি অবজেক্টের জন্য , আপনি এই কোডটি ব্যবহার করতে পারেন, 'অবজেক্ট' এর পরিবর্তে আপনার আগ্রহী অবজেক্টটির সাথে:

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

আমি এটি diveintopython.net এ আবিষ্কার করেছি (এখন সংরক্ষণাগারভুক্ত)। আশা করি, এটি আরও কিছু বিশদ সরবরাহ করা উচিত!

যদি আপনি এটি পান তবে আপনি AttributeErrorএটির পরিবর্তে এটি ব্যবহার করতে পারেন :

getattr(পান্ডাস স্টাইল পাইথন 3.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
এটি তালিকা অনুধাবন, পদ্ধতির একটি তালিকা ফিরিয়ে দেওয়া যেখানে পদ্ধতি তালের একটি আইটেম দির (অবজেক্ট) দ্বারা ফিরে আসে এবং যেখানে প্রতিটি পদ্ধতি তালিকার সাথে যুক্ত হয় কেবল যদি গ্যাটট্রা (বস্তু, পদ্ধতি) একটি কলযোগ্য ফেরত দেয়।
মেনবুয়েরকো

1
আপনি ঠিক কীভাবে এটি ব্যবহার করেন? পদ্ধতিগুলির একটি তালিকা মুদ্রণ করতে বলতে।
মার্শ

12
পদ্ধতি মুদ্রণ করতে @marsh: print [method for method in dir(object) if callable(getattr(object, method))]
ওরিয়েন্টিয়ারিক্স

1
আমি AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'এটি চালানোর চেষ্টা করার সময় আমি পেয়ে যাচ্ছি । স্ট্যাকওভারফ্লো . com/q/54713287/9677043 এ বিশদ দেখুন ।
কার্ল বাকের

1
পাইথন ৩.6-তে প্যান্ডাস ডেটা ফ্রেম অবজেক্টের জন্য কাজ করে না।
স্টিফান কার্লসন

226

dir()মডিউলটিতে থাকা সমস্ত বৈশিষ্ট্যের একটি তালিকা পেতে আপনি বিল্ট ইন ফাংশনটি ব্যবহার করতে পারেন । এটি কীভাবে কাজ করে তা দেখতে কমান্ড লাইনে এটি চেষ্টা করুন।

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

এছাড়াও, hasattr(module_name, "attr_name")কোনও মডিউলের একটি নির্দিষ্ট বৈশিষ্ট্য রয়েছে কিনা তা জানতে আপনি ফাংশনটি ব্যবহার করতে পারেন ।

আরও তথ্যের জন্য পাইথনের অন্তর্নির্দেশের গাইড দেখুন ।


hasattrপাইথন অবজেক্টের নির্দিষ্ট সদস্যের পরিবর্তনশীল বা পদ্ধতি রয়েছে কিনা তা অনুসন্ধানে আমার ব্যবহারের ক্ষেত্রে সহায়তা করেছিল।
অক্ষয়

আমি নিশ্চিত না কেন এই সমাধানটি পর্যাপ্ত পরিমাণে উত্সাহিত হয়নি। এটি নিবিড় এবং নির্ভুল।
প্রসাদ রাঘভেন্দ্র

93

সবচেয়ে সহজ পদ্ধতিটি ব্যবহার করা dir(objectname)। এটি সেই অবজেক্টের জন্য উপলব্ধ সমস্ত পদ্ধতি প্রদর্শন করবে। কুল কৌশল।


2
এটি বস্তুর বৈশিষ্ট্যগুলিও প্রদর্শন করে, সুতরাং আপনি যদি বিশেষভাবে পদ্ধতিগুলি সন্ধান করতে চান তবে এটি কার্যকর হবে না।
এরিক

হ্যাঁ. একমত। তবে, কেবলমাত্র পদ্ধতির তালিকা পেতে আমি অন্য কোনও কৌশল সম্পর্কে অবগত নই। সম্ভবত সেরা ধারণাটি হ'ল বৈশিষ্ট্য এবং পদ্ধতি উভয়ের তালিকা পাওয়া এবং তারপরে আরও ফিল্টার আউট <হাসাটার (অবজেক্ট, "পদ্ধতি_নাম") ব্যবহার করুন?
পবন কুমার

1
@ নিউরনেট, আমি গৃহীত উত্তরটি চালানোর চেষ্টা করছি তবে একটি পেয়ে যাচ্ছি AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'। কোন ধারনা? এ deets দেখুন stackoverflow.com/q/54713287/9677043 । +1 পবন কুমার বি / সি থেকে উত্তরগুলি কাজ করে, এবং কেবলমাত্র পদ্ধতির ফিল্টারড তালিকা দেওয়ার প্রতিশ্রুতি হিসাবে @ এলজেএসকে।
কার্ল বাকের

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__করে তবে এটি ব্যবহৃত হবে; অন্যথায় ডিফল্ট ডিয়ার () যুক্তি ব্যবহৃত হয় এবং ফিরে আসে:

  • মডিউল অবজেক্টের জন্য: মডিউলটির বৈশিষ্ট্য।
  • একটি শ্রেণি অবজেক্টের জন্য: এর বৈশিষ্ট্যগুলি এবং পুনরায় ক্রমান্বয়ে এর ঘাঁটির বৈশিষ্ট্য।
  • অন্য যে কোনও বস্তুর জন্য: এর বৈশিষ্ট্যগুলি, এর শ্রেণীর বৈশিষ্ট্যগুলি এবং পুনরাবৃত্তভাবে তার শ্রেণীর বেস শ্রেণীর বৈশিষ্ট্য।

উদাহরণ স্বরূপ:

$ 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 (পাইথন ২.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 (পাইথন ৩.৪.৩)

#!/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
অবদান? তোমার উত্তর পাইথন ২.7.১২ এ আমার জন্য কাজ করেছে, তাই হ্যাঁ!
gsamaras

23

আরও প্রত্যক্ষ উত্তরের উপরে, আমি আইপ্যাথনের উল্লেখ না করলে আমি পরিতৃপ্ত হব । স্বতঃপূরণ সহ উপলভ্য পদ্ধতিগুলি দেখতে 'ট্যাব' টিপুন।

এবং একবার আপনি একটি পদ্ধতি খুঁজে পেয়েছেন, চেষ্টা করুন:

help(object.method) 

পাইডোকস, পদ্ধতির স্বাক্ষর ইত্যাদি দেখতে

আহা ... REPL


12

আপনি যদি বিশেষত পদ্ধতিগুলি চান তবে আপনার উচিত inspect.ismethod ব্যবহার করা ।

পদ্ধতির নামের জন্য:

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

উন্মুক্ত বাশ শেল (উবুন্টুতে সিটিআরএল + ওল্ট + টি)। এটিতে পাইথন 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
@ ম্যাক্সকপলান আমি যেসব ক্ষেত্রে ট্যাব-সমাপ্তি ডিফল্টরূপে সক্ষম না করা হয়েছে তার কোডের জন্য কোডটি সংশোধন করেছি
ভ্যালারি রামুসিক

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)

%প্রথম উদাহরণে কী করে ? এটি আমার পাইথন ২.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??

'??' দিয়ে আপনার অবজেক্টের ঠিক পরে, এটি আপনাকে শ্রেণীর সমস্ত বৈশিষ্ট্য / পদ্ধতিগুলি প্রদর্শন করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.