Подтвердить что ты не робот

Как проверить, существует ли метод в Python?

В функции __getattr__(), если указанная переменная не найдена, она дает ошибку. Как проверить, существует ли переменная или метод как часть объекта?

import string
import logging

class Dynamo:
 def __init__(self,x):
  print "In Init def"
  self.x=x
 def __repr__(self):
  print self.x
 def __str__(self):
  print self.x
 def __int__(self):
  print "In Init def"
 def __getattr__(self, key):
    print "In getattr"
    if key == 'color':
        return 'PapayaWhip'
    else:
        raise AttributeError


dyn = Dynamo('1')
print dyn.color
dyn.color = 'LemonChiffon'
print dyn.color
dyn.__int__()
dyn.mymethod() //How to check whether this exist or not
4b9b3361

Ответ 1

Как насчет функции dir() до getattr()?

>>> "mymethod" in dir(dyn)
True

Ответ 2

Проще просить прощения, чем спрашивать разрешения.

Не проверяйте, существует ли метод. Не тратьте ни одной строки кода на "проверку"

try:
    dyn.mymethod() # How to check whether this exists or not
    # Method exists and was used.  
except AttributeError:
    # Method does not exist; What now?

Ответ 3

Проверьте, имеет ли класс такой метод?

hasattr(Dynamo, key) and callable(getattr(Dynamo, key))

или

hasattr(Dynamo, 'mymethod') and callable(getattr(Dynamo, 'mymethod'))

Вы можете использовать self.__class__ вместо Dynamo

Ответ 4

Вы можете попробовать использовать модуль 'inspect':

import inspect
def is_method(obj, name):
    return hasattr(obj, name) and inspect.ismethod(getattr(obj, name))

is_method(dyn, 'mymethod')

Ответ 5

Как насчет поиска в dyn.__dict__?

try:
    method = dyn.__dict__['mymethod']
except KeyError:
    print "mymethod not in dyn"

Ответ 6

Может быть, так, если все методы вызываются

app = App(root) # some object call app 
att = dir(app) #get attr of the object att  #['doc', 'init', 'module', 'button', 'hi_there', 'say_hi']

for i in att: 
    if callable(getattr(app, i)): 
        print 'callable:', i 
    else: 
        print 'not callable:', i

Ответ 7

Если ваш метод находится за пределами класса, и вы не хотите его запускать и создавать исключение, если оно не существует:

'mymethod' in globals()

Ответ 8

Я думаю, вам стоит посмотреть на пакет inspect. Это позволяет вам "обернуть" некоторые из вещей. Когда вы используете метод dir, он также отображает встроенные методы, унаследованные методы и все другие атрибуты, делающие возможными конфликты, например:

class One(object):

    def f_one(self):
        return 'class one'

class Two(One):

    def f_two(self):
        return 'class two'

if __name__ == '__main__':
    print dir(Two)

Массив, который вы получаете из dir(Two), содержит как f_one, так и f_two и множество встроенных файлов. С помощью inspect вы можете сделать это:

class One(object):

    def f_one(self):
        return 'class one'

class Two(One):

    def f_two(self):
        return 'class two'

if __name__ == '__main__':
    import inspect

    def testForFunc(func_name):
        ## Only list attributes that are methods
        for name, _ in inspect.getmembers(Two, inspect.ismethod):
            if name == func_name:
                return True
        return False

    print testForFunc('f_two')

В этих примерах все еще перечислены оба метода в двух классах, но если вы хотите ограничить проверку только функцией в определенном классе, для этого требуется немного больше работы, но это абсолютно возможно.