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')
그것을 찾아 보는 것은 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
나는 아래 유틸리티 기능을 사용합니다. 람다, 클래스 메서드 및 인스턴스 메서드에서 작동합니다.
유틸리티 방법
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
If your method is outside of a class and you don't want to run it and raise an exception if it doesn't exist:
'mymethod' in globals()
I think you should look at the inspect
package. It allows you to 'wrap' some of the things. When you use the dir
method it also list built in methods, inherited methods and all other attributes making collisions possible, e.g.:
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)
The array you get from dir(Two)
contains both f_one
and f_two
and a lot of built in stuff. With inspect
you can do this:
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')
This examples still list both methods in the two classes but if you want to limit the inspection to only function in a specific class it requires a bit more work, but it is absolutely possible.
참고URL : https://stackoverflow.com/questions/7580532/how-to-check-whether-a-method-exists-in-python
'Programing' 카테고리의 다른 글
원격 지점으로 푸시 할 수 없습니다. 지점으로 확인할 수 없습니다. (0) | 2020.11.19 |
---|---|
그룹화 된 스타일 UITableView 섹션에서 셀 테두리 제거 (0) | 2020.11.19 |
PhpStorm으로 xdebug가 첫 번째 줄에서 멈추는 것을 막는 방법은 무엇입니까? (0) | 2020.11.19 |
C #에 "중간"함수가 있습니까? (0) | 2020.11.19 |
Scale UIButton 애니메이션-Swift (0) | 2020.11.19 |