Bir Python nesnesinin hangi yöntemlere sahip olduğunu bulma


429

Herhangi bir Python nesnesi göz önüne alındığında, bu nesnenin sahip olduğu tüm yöntemlerin listesini almanın kolay bir yolu var mı?

Veya,

bu mümkün değilse, yöntem çağrıldığında bir hatanın oluşup oluşmadığını kontrol etmekten başka, belirli bir yöntemi olup olmadığını kontrol etmenin en az kolay bir yolu var mı?


Yanıtlar:


523

Birçok nesne için , 'nesne'yi yerine ilgilendiğiniz nesneyle değiştirerek bu kodu kullanabilirsiniz:

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

Ben diveintopython.net (Şimdi arşivlendi) de keşfettim . Umarım, bu daha fazla ayrıntı vermelidir!

Bir alırsanız AttributeError, bunun yerine bunu kullanabilirsiniz :

getattr(panda tarzı python3.6 soyut sanal alt sınıfların hoşgörüsüz olduğunu. Bu kod yukarıdakiyle aynıdır ve istisnaları yoksayar.

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
Yöntemin dir (object) tarafından döndürülen listede bir öğe olduğu ve her yöntemin yalnızca getattr (object, method) çağrılabilir bir döndürdüğünde listeye eklendiği yöntemlerin listesini döndüren bir liste kavramadır.
Mnebuerquo

1
Bunu tam olarak nasıl kullanıyorsunuz? Söylemek için yöntemlerin bir listesini yazdırın.
bataklık

12
yöntemleri yazdırmak için @marsh: print [method for method in dir(object) if callable(getattr(object, method))].
Orienteerix

1
Bunu AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'çalıştırmaya çalıştığımda bir an alıyorum . Ayrıntılara stackoverflow.com/q/54713287/9677043 adresinden bakın .
Karl Baker

1
python 3.6 panda veri çerçevesi nesnesi için çalışmaz.
Stefan Karlsson

226

dir()Bir modülün sahip olduğu tüm özniteliklerin bir listesini almak için yerleşik işlevi kullanabilirsiniz. Nasıl çalıştığını görmek için bunu komut satırında deneyin.

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

Ayrıca, hasattr(module_name, "attr_name") bir modülün belirli bir niteliğe sahip olup olmadığını öğrenmek işlevi .

Daha fazla bilgi için Python Kılavuzu'na bakış


hasattrpython nesnesinin belirli bir üye değişkeni veya yöntemi olup olmadığını bulmak için kullanım durumuma yardımcı oldu.
Akshay

Bu çözümün neden yeterince yükseltilmediğinden emin değilim. Bu kısa ve doğrudur.
Prasad Raghavendra

93

En basit yöntem kullanmaktır dir(objectname). Bu nesne için kullanılabilir tüm yöntemleri görüntüler. Güzel numara.


3
Ayrıca nesnenin özniteliklerini görüntüler, bu nedenle özellikle yöntemleri bulmak istiyorsanız, çalışmaz.
eric

Evet. Kabul. Ancak, sadece yöntemlerin listesini almak için başka bir tekniğin farkında değilim. Belki de en iyi fikir, hem özniteliklerin hem de yöntemlerin listesini almak ve daha sonra filtrelemek için <hasattr (object, "method_name"> kullanmaktır?)
Pawan Kumar

1
@neuronet, kabul edilen cevabı çalıştırmaya çalışıyorum ama alıyorum AttributeError: module 'pandas.core.common' has no attribute 'AbstractMethodError'. Herhangi bir fikir? En Deets Bkz stackoverflow.com/q/54713287/9677043 . +1, @Pawan Kumar b / c'ye cevap verir ve sadece yöntemlerin filtrelenmiş bir listesinin vaadi için @ljs'ye.
Karl Baker

30

Belirli bir yöntemi olup olmadığını kontrol etmek için:

hasattr(object,"method")

14
OP sadece ve nitelik değil, bir yöntem aradığından, bir adım daha ileri gitmek istediğinizi düşünüyorum:if hasattr(obj,method) and callable(getattr(obj,method)):
Bruno Bronosky

28

İstediğin şunun böyle olduğuna inanıyorum:

bir nesneden niteliklerin listesi

Benim düşünceme göre, yerleşik işlev dir()bu işi sizin için yapabilir. Alındığı help(dir)Python Shell üzerinde çıktı:

dir (...)

dir([object]) -> list of strings

Bağımsız değişken olmadan çağrılırsa, geçerli kapsamdaki adları döndürün.

Aksi takdirde, verilen nesnenin niteliklerini ve ondan erişilebilen nitelikleri içeren (bazıları) alfabetikleştirilmiş bir ad listesi döndürün.

Nesne adlı bir yöntem sağlarsa __dir__, bu yöntem kullanılır; aksi takdirde varsayılan dir () mantığı kullanılır ve döndürür:

  • modül nesnesi için: modülün özellikleri.
  • sınıf nesnesi için: öznitelikleri ve tabanlarının özyinelemeleri.
  • diğer nesneler için: öznitelikleri, sınıfının öznitelikleri ve sınıfının temel sınıflarının özyinelemeli öznitelikleri.

Örneğin:

$ 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']

Sorununuzu kontrol ederken, düşünce trenimi çıktısının daha iyi biçimlendirilmesiyle göstermeye karar verdim 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("")

Umarım katkıda bulundum :).


1
Katkıda? Cevaplarınız Python 2.7.12'de benim için çalıştı, bu yüzden cehennem evet!
gsamaras

23

Daha doğrudan cevapların yanı sıra, iPython'dan bahsetmezsem hatırlardım . Otomatik tamamlama ile kullanılabilir yöntemleri görmek için 'sekme' tuşuna basın.

Bir yöntem bulduğunuzda şunu deneyin:

help(object.method) 

pydocları, yöntem imzasını vb. görmek için

Ahh ... REPL .


12

Özellikle yöntem istiyorsanız , inspect.ismethod kullanmalısınız .

Yöntem adları için:

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

Yöntemlerin kendileri için:

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

Bazen inspect.isroutinede yararlı olabilir ("bağlayıcı" derleyici yönergesi olmayan yerleşik, C uzantıları, Cython için).


Liste kavrayışında kullanmak inspect.getmembersyerine kullanmamalısınız dir?
Boris

Evet, daha iyi görünüyor!
paulmelnikow

11

Bash kabuğunu açın (Ubuntu'da ctrl + alt + T). İçinde python3 kabuğu başlatın. Yöntemlerini gözlemlemek için nesne oluşturun. Sonra bir nokta ekleyin ve iki kez "sekme" tuşuna basın ve şöyle bir şey göreceksiniz:

 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
Bunun gibi geçici çözümlerden bahsederken, çalıştırabileceğinizi ipython, nesneyi yazmaya başlayacağınızı ve basacağınız tabzaman da işe yarayacağını ekleyeceğim .
Readline

1
@MaxCoplan Sekme tamamlamanın varsayılan olarak etkin olmadığı durumlarda kodda geçici çözümü ekledim
Valery Ramusik

8

Burada belirtilen tüm yöntemlerle ilgili sorun, bir yöntemin var olmadığından emin olamamanızdır.

Python'da nokta aramasını arayabilir __getattr__ve__getattribute__ "çalışma zamanında" yönteminin oluşturulmasını mümkün

exemple:

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

Yürütürseniz, nesne sözlüğünde var olmayan yöntemi çağırabilirsiniz ...

>>> 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

Ve bu yüzden Python'daki izin paradigmalarından daha affetmek için Easy'yi kullanıyorsunuz .


6

Herhangi bir nesnenin yöntemlerinin listesini almanın en basit yolu help()komutu kullanmaktır .

%help(object)

Bu nesne ile ilişkili tüm mevcut / önemli yöntemleri listeleyecektir.

Örneğin:

help(str)

%İlk örnekte ne yapar ? Python 2.7'imde çalışmıyor.
Scorchio

@Scorchio "Python yerine" >>> "istemi olarak"% "kullandım. Komutu çalıştırmadan önce% işaretini kaldırabilirsiniz.
Paritosh Vyas

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

Bu çalışmalı :)


1

Bir getAttrsnesnenin çağrılabilir özellik adlarını döndürecek bir işlev oluşturulabilir

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

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

Geri dönecekti

['__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

Tüm nesnelerin yöntemlerini listelemenin güvenilir bir yolu yoktur. dir(object)genellikle yararlıdır, ancak bazı durumlarda tüm yöntemleri listeleyemeyebilir. Göre dir()belgeler : "Bir argüman ile teşebbüs bu nesne için geçerli özelliklerin bir listesini döndürmek için."

Bu yöntemin var olup olmadığını kontrol etmek, callable(getattr(object, method))daha önce bahsedildiği gibi yapılabilir .


1

Listeyi nesne olarak alma

obj = []

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

Şunları elde edersiniz:

['__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

... yöntem çağrıldığında bir hatanın oluşup oluşmadığını kontrol etmekten başka, belirli bir yöntemi olup olmadığını kontrol etmenin en az kolay bir yolu var mı?

" Affetmeden izin istemekten daha kolay " kesinlikle Pythonic yöntem olsa da, aradığınız şey:

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

0

Bir modülün tamamında belirli bir yöntemi aramak için

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

-1

Örneğin, kabuk artı kullanıyorsanız, bunun yerine bunu kullanabilirsiniz:

>> MyObject??

bu şekilde, '??' nesnenizden hemen sonra, sınıfın sahip olduğu tüm nitelikleri / yöntemleri gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.