Python nesne neler yöntemler bulma

oy
253

Her türlü Python nesne göz önüne alındığında, bu nesne sahip olduğu tüm yöntemleri listesini almak için kolay bir yol var?

Veya,

Bu mümkün değilse, sadece yöntemi çağrıldığında bir hata oluşursa kontrol dışındaki belirli bir yöntem olup olmadığını kontrol etmek için kolay bir yol, en azından var mı?

Oluştur 29/08/2008 saat 14:05
kaynak kullanıcı
Diğer dillerde...                            


16 cevaplar

oy
322

Ilgilendiğiniz nesne ile 'nesne' yerine, bu kodu kullanabilirsiniz görüntülenir: -

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

Ben de keşfetti bu sitede umarım bazı başka ayrıntı vermelidir!

Cevap 29/08/2008 saat 14:09
kaynak kullanıcı

oy
147

Sen yerleşik kullanabilirsiniz dir()bir modül sahip olduğu tüm özelliklerin bir listesini almak için işlevini. Nasıl çalıştığını görmek için komut satırına bu deneyin.

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

Ayrıca, kullanabileceğiniz hasattr(module_name, "attr_name")bir modül belirli özeliği varsa öğrenmek için işlevini.

Bkz Python içgözlem için Kılavuzu Daha fazla bilgi için.

Cevap 29/08/2008 saat 14:36
kaynak kullanıcı

oy
24

belirli bir yöntem olup olmadığını kontrol etmek için:

hasattr(object,"method")
Cevap 29/08/2008 saat 14:40
kaynak kullanıcı

oy
18

Ben bahsetmiyorlar daha doğrudan yanıtlar üzerine, ben gafil duyarım ipython . Otomatik tamamlanması ile, mevcut yöntemleri görmek üzere 'sekmesini' vur.

Eğer bir yöntem buldum Ve bir kez deneyin:

help(object.method) 

pydocs, yöntem imzası görmek, vb

... Ahh REPL .

Cevap 29/08/2008 saat 14:47
kaynak kullanıcı

oy
1

... basitçe bir hata yöntemi çağrıldığında ortaya çıkarsa kontrol dışında belirli bir yöntem olup olmadığını kontrol etmek için kolay bir yol, en azından orada

"Iken izni daha af dilemesini kolay kesinlikle Pythonic yoludur", belki ne arıyorsun:

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'
Cevap 26/03/2013 saat 12:51
kaynak kullanıcı

oy
35

basit yöntem, dir (objectname) kullanmaktır. O nesne için mevcut tüm yöntemleri gösterecektir. Serin numara.

Cevap 20/11/2013 saat 14:06
kaynak kullanıcı

oy
5

Burada belirtilen bütün yöntemlerle sorun bir yöntem yok emin olun CAN NOT olmasıdır.

Python size aracılığıyla çağıran nokta müdahale edebilir __getattr__ve __getattribute__mümkün "zamanında" yöntemini oluşturmak için yapım

exemple:

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

bunu gerçekleştirmenin varsa, nesne sözlükte mevcut olmayan yöntemini ç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

Kullanmak Ve neden bu kadar izin daha af dilemesini kolay Python paradigmaların.

Cevap 09/12/2014 saat 12:02
kaynak kullanıcı

oy
7

Özellikle istiyorsanız yöntemleri , kullanmak gerekir inspect.ismethod .

yöntem isimleri için:

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

yöntemleri için kendilerini:

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

Bazen inspect.isroutineçok yararlı olabilir (built-in, C uzantıları, Cython "bağlayıcı" derleyici direktifi olmadan).

Cevap 29/01/2015 saat 15:10
kaynak kullanıcı

oy
2

Biri oluşturabilir getAttrsbir nesnenin çağrılabilir özellik adlarını döndürür işlevi

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

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

Yani döneceğini

['__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']
Cevap 24/04/2015 saat 14:37
kaynak kullanıcı

oy
2

Tüm nesnenin metotlarını listelemek için güvenilir bir yolu yoktur. dir(object)Genellikle yararlıdır, ancak bazı durumlarda tüm yöntemleri listelemek olmayabilir. 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öntemi Denetleme yapılabilir var callable(getattr(object, method))zaten orada sözü.

Cevap 16/09/2015 saat 11:13
kaynak kullanıcı

oy
14

Ben ne istediğini böyle bir şey olduğuna inanıyoruz:

bir nesneden özelliklerin listesi

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

dir (...)

dir([object]) -> list of strings

bağımsız değişken olmadan denilen, geçerli kapsamda isimlerini döndürür.

Başka, (bazı) belirli bir nesnenin özellikleri içeren isimleri alfabetik liste dönmek ve ondan niteliklerin ulaşılabilir.

Nesne adında bir yöntemi temin ederse __dir__, bu kullanılacaktır; Aksi varsayılan dir () mantık kullanılır ve iadeler edilir:

  • modülün nitelikler: Bir modül nesnesi için.
  • niteliklerini, ve bazların yinelemeli Özellik: Bir sınıf nesnesi için.
  • Başka bir nesne için: kendi nitelikleri, onun sınıfının nitelikleri ve onun sınıfının temel sınıflar yinelemeli nitelikleri.

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

Ben sorununuzu kontrol ediyordu, ben çıktısının daha iyi bir biçimlendirme ile, düşünce benim tren göstermeye karar verdiler 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("")

Ben :) katkıda bulunduğunu Umut.

Cevap 26/05/2016 saat 13:58
kaynak kullanıcı

oy
2

Açık Bash kabuk (Ubuntu Ctrl + Alt + T). İçinde python3 kabuğunu başlatın. yöntemlerini gözlemlemek nesne oluşturun. Sadece bir ondan sonra nokta ve iki kez basın "sekme" ekleyip böyle bir şey görürsünüz:

 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(           
Cevap 15/11/2017 saat 18:56
kaynak kullanıcı

oy
0

bir nesne olarak bir liste alın

obj = []

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

Sen alıyorum:

['__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']
Cevap 16/01/2018 saat 13:34
kaynak kullanıcı

oy
0

bir bütün modülünde belirli bir yönteme aramak amacıyla

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")
Cevap 09/03/2018 saat 11:11
kaynak kullanıcı

oy
2

Herhangi bir nesnenin yöntemleri listesini almak için en basit yolu kullanmaktır help()komutu.

%help(object)

O nesneyle ilişkili tüm mevcut / önemli yöntemler listelenir.

Örneğin:

help(str)
Cevap 26/04/2018 saat 18:32
kaynak kullanıcı

oy
0

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

Bu çalışmalı :)

Cevap 22/11/2019 saat 05:10
kaynak kullanıcı

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