Βρίσκοντας τι μεθόδους έχει ένα αντικείμενο Python

ψήφοι
253

Λαμβάνοντας υπόψη το αντικείμενο της Python οποιουδήποτε είδους, είναι ένας εύκολος τρόπος για να πάρετε τη λίστα όλων των μεθόδων που αυτό το αντικείμενο έχει εκεί;

Ή,

αν αυτό δεν είναι δυνατό, υπάρχει τουλάχιστον ένας εύκολος τρόπος για να ελέγξετε αν έχει μια συγκεκριμένη μέθοδο, εκτός από απλά να ελέγξετε αν ένα σφάλμα παρουσιάζεται όταν η μέθοδος ονομάζεται;

Δημοσιεύθηκε 29/08/2008 στις 16:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


16 απαντήσεις

ψήφοι
322

Φαίνεται μπορείτε να χρησιμοποιήσετε αυτόν τον κωδικό, αντικαθιστώντας «αντικείμενο» με το αντικείμενο που σας ενδιαφέρει: -

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

Το ανακάλυψα σε αυτό το site , ελπίζουμε ότι θα πρέπει να παρέχουν κάποια περαιτέρω λεπτομέρειες!

Απαντήθηκε 29/08/2008 στις 16:09
πηγή χρήστη

ψήφοι
147

Μπορείτε να χρησιμοποιήσετε την ενσωματωμένη dir()λειτουργία για να πάρετε μια λίστα με όλα τα χαρακτηριστικά μια μονάδα έχει. Δοκιμάστε αυτό στη γραμμή εντολών για να δείτε πώς λειτουργεί.

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

Επίσης, μπορείτε να χρησιμοποιήσετε τη hasattr(module_name, "attr_name")λειτουργία για να διαπιστώσετε εάν μια μονάδα έχει ένα ιδιαίτερο χαρακτηριστικό.

Δείτε τον οδηγό να Python ενδοσκόπηση για περισσότερες πληροφορίες.

Απαντήθηκε 29/08/2008 στις 16:36
πηγή χρήστη

ψήφοι
24

Για να ελέγξετε αν έχει μια συγκεκριμένη μέθοδο:

hasattr(object,"method")
Απαντήθηκε 29/08/2008 στις 16:40
πηγή χρήστη

ψήφοι
18

Στην κορυφή των πιο άμεσες απαντήσεις, θα ήταν παράλειψη αν δεν ανέφερα IPython . Hit «καρτέλα» για να δείτε τις διαθέσιμες μεθόδους, με αυτόματη συμπλήρωση.

Και από τη στιγμή που έχετε βρει μια μέθοδο, δοκιμάστε:

help(object.method) 

για να δείτε το pydocs, μέθοδο υπογραφής, κ.λπ.

Ααα ... REPL .

Απαντήθηκε 29/08/2008 στις 16:47
πηγή χρήστη

ψήφοι
1

... είναι τουλάχιστον υπάρχει ένας εύκολος τρόπος για να ελέγξετε αν έχει μια συγκεκριμένη μέθοδο, εκτός από απλά ελέγχοντας αν παρουσιαστεί κάποιο σφάλμα όταν η μέθοδος καλείται

Ενώ « Είναι πιο εύκολο να ζητήσει συγχώρεση από άδεια » είναι σίγουρα ο τρόπος Pythonic, τι ψάχνετε για ίσως:

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'
Απαντήθηκε 26/03/2013 στις 15:51
πηγή χρήστη

ψήφοι
35

Η απλούστερη μέθοδος είναι η χρήση dir (ObjectName). Αυτό θα εμφανίσει όλες τις διαθέσιμες μεθόδους για αυτό το αντικείμενο. Cool κόλπο.

Απαντήθηκε 20/11/2013 στις 17:06
πηγή χρήστη

ψήφοι
5

Το πρόβλημα με όλες τις μεθόδους που αναφέρονται εδώ είναι ότι δεν μπορείτε να είστε σίγουροι ότι η μέθοδος δεν υπάρχει.

Στην Python, μπορείτε να υποκλέψει την τελεία κλήση μέσω __getattr__και __getattribute__, καθιστώντας δυνατή τη δημιουργία μέθοδο «κατά το χρόνο εκτέλεσης»

Exemple:

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

Και είναι ο λόγος που χρησιμοποιούν το πιο εύκολο να ζητήσει συγχώρεση από άδεια παραδείγματα στην Python.

Απαντήθηκε 09/12/2014 στις 14:02
πηγή χρήστη

ψήφοι
7

Αν θέλετε συγκεκριμένα μεθόδους , θα πρέπει να χρησιμοποιήσετε 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μπορεί να είναι πολύ χρήσιμη (για ενσωματωμένο ins, C επεκτάσεις, Cython χωρίς το «δεσμευτικό» οδηγία compiler).

Απαντήθηκε 29/01/2015 στις 17:10
πηγή χρήστη

ψήφοι
2

Κάποιος μπορεί να δημιουργήσει μια 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']
Απαντήθηκε 24/04/2015 στις 15:37
πηγή χρήστη

ψήφοι
2

Δεν υπάρχει αξιόπιστος τρόπος για να απαριθμήσει τις μεθόδους όλα αντικειμένου. dir(object)είναι συνήθως χρήσιμο, αλλά σε ορισμένες περιπτώσεις δεν μπορεί να απαριθμήσει όλες τις μεθόδους. Σύμφωνα με την dir()τεκμηρίωση : «Με ένα επιχείρημα, να προσπαθήσει να επιστρέψει μια λίστα έγκυρων χαρακτηριστικά για αυτό το αντικείμενο.»

Έλεγχος ότι η μέθοδος υπάρχει μπορεί να γίνει callable(getattr(object, method))όπως έχει ήδη αναφερθεί.

Απαντήθηκε 16/09/2015 στις 12:13
πηγή χρήστη

ψήφοι
14

Πιστεύω ότι αυτό που θέλουν είναι κάτι σαν αυτό:

μια λίστα των χαρακτηριστικών από ένα αντικείμενο

Κατά την ταπεινή μου γνώμη, η ενσωματωμένη λειτουργία dir()μπορεί να κάνει αυτή τη δουλειά για σας. Απόσπασμα από help(dir)έξοδο στην Python Shell σας:

dir (...)

dir([object]) -> list of strings

Αν λέγεται χωρίς επιχείρημα, να επιστρέψει τα ονόματα στο τρέχον πεδίο.

Αλλιώς, επιστρέψει μια αλφαβητική λίστα των ονομάτων που περιλαμβάνει (μερικά από) τα χαρακτηριστικά του δεδομένου αντικειμένου, και των χαρακτηριστικών προσβάσιμο από αυτό.

Αν το αντικείμενο παρέχει μια μέθοδο που ονομάζεται __dir__, θα χρησιμοποιηθεί? Αλλιώς η λογική προεπιλογή dir () χρησιμοποιείται και επιστρέφει:

  • για ένα αντικείμενο ενότητας: τα χαρακτηριστικά του module.
  • για μια κλάση αντικειμένων: τα χαρακτηριστικά του, και αναδρομικά τα χαρακτηριστικά των βάσεων του.
  • για οποιοδήποτε άλλο αντικείμενο: τα χαρακτηριστικά του, τα χαρακτηριστικά της κατηγορίας του, καθώς και αναδρομικά τα χαρακτηριστικά των βασικών κλάσεων της κατηγορίας της.

Για παράδειγμα:

$ 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 (Python 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("")

Ελπίζω ότι έχω συμβάλει :).

Απαντήθηκε 26/05/2016 στις 14:58
πηγή χρήστη

ψήφοι
2

Ανοιχτό κέλυφος bash (Ctrl + Alt + T στο Ubuntu). Ξεκινήστε κέλυφος python3 σε αυτό. Δημιουργήστε αντικείμενο να παρατηρήσει τις μεθόδους του. Απλά προσθέστε μια τελεία μετά και πατήστε το πλήκτρο δύο φορές «καρτέλα» και θα δείτε κάτι σαν αυτό:

 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.
 >>> s = "Any object. Now it's a string"
 >>> s. # here tab should be pressed twice times
 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(           
Απαντήθηκε 15/11/2017 στις 20:56
πηγή χρήστη

ψήφοι
0

Πάρτε μια λίστα ως αντικείμενο

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']
Απαντήθηκε 16/01/2018 στις 15:34
πηγή χρήστη

ψήφοι
0

Για να αναζητήσετε μια συγκεκριμένη μέθοδο σε ολόκληρη μονάδα

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")
Απαντήθηκε 09/03/2018 στις 13:11
πηγή χρήστη

ψήφοι
2

Ο απλούστερος τρόπος για να πάρετε λίστα των μεθόδων οποιοδήποτε αντικείμενο είναι να χρησιμοποιήσετε help()την εντολή.

%help(object)

Θα απαριθμήσω όλα τα διαθέσιμα / σημαντικές μεθόδους που σχετίζονται με αυτό το αντικείμενο.

Για παράδειγμα:

help(str)
Απαντήθηκε 26/04/2018 στις 19:32
πηγή χρήστη

ψήφοι
0

import moduleName
for x in dir(moduleName):
print(x)

Αυτό θα πρέπει να λειτουργεί :)

Απαντήθηκε 22/11/2019 στις 07:10
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more