함수 __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