Ответ 1
Как насчет функции dir()
до getattr()
?
>>> "mymethod" in dir(dyn)
True
В функции __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
Вы можете попробовать использовать модуль 'inspect':
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
Если ваш метод находится за пределами класса, и вы не хотите его запускать и создавать исключение, если оно не существует:
'mymethod' in globals()
Я думаю, вам стоит посмотреть на пакет 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')
В этих примерах все еще перечислены оба метода в двух классах, но если вы хотите ограничить проверку только функцией в определенном классе, для этого требуется немного больше работы, но это абсолютно возможно.