[python] 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



답변

방법에 대한 dir()전 기능 getattr()?

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


답변

허락을 구하는 것보다 용서를 구하는 것이 더 쉽습니다.

메서드가 있는지 확인하지 마십시오. “검사”에 한 줄의 코드를 낭비하지 마십시오.

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


답변

수업에 이러한 방법이 있는지 확인하십시오.

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

또는

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

self.__class__대신 사용할 수 있습니다.Dynamo


답변

‘검사’모듈을 사용해 볼 수 있습니다.

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

is_method(dyn, 'mymethod')


답변

나는 아래 유틸리티 기능을 사용합니다. 람다, 클래스 메서드 및 인스턴스 메서드에서 작동합니다.

유틸리티 방법

def has_method(o, name):
    return callable(getattr(o, name, None))

사용 예

테스트 클래스를 정의합시다

class MyTest:
  b = 'hello'
  f = lambda x: x

  @classmethod
  def fs():
    pass
  def fi(self):
    pass

이제 시도해 볼 수 있습니다.

>>> a = MyTest()
>>> has_method(a, 'b')
False
>>> has_method(a, 'f')
True
>>> has_method(a, 'fs')
True
>>> has_method(a, 'fi')
True
>>> has_method(a, 'not_exist')
False


답변

그것을 찾아 보는 것은 dyn.__dict__어떻습니까?

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


답변

아마도 이렇게 모든 메소드가 호출 가능하다고 가정하면

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