如何检查Python中是否存在方法?

在函数__getattr__() ,如果没有find被引用的variables,则会给出错误。 如何检查一个variables或方法是否作为对象的一部分存在?

 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 

getattr()之前, dir()函数怎么样?

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

请求宽恕比请求允许要容易。

不要检查是否存在方法。 不要在“检查”时浪费一行代码

 try: dyn.mymethod() //How to check whether this exist 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__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 

如果你的方法是在一个类之外的,并且你不想运行它,并且在它不存在的时候引发一个exception:

'mymethod' in globals()

我想你应该看看inspect包。 它可以让你“包装”一些东西。 当你使用dir方法的时候,它也列出了内置的方法,inheritance的方法和所有其他使得碰撞成为可能的属性,例如:

 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_onef_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') 

这个例子仍然列出了这两个类中的两种方法,但是如果你想限制检查只能在一个特定的类function,它需要更多的工作,但这是绝对有可能的。