如何检查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_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')
这个例子仍然列出了这两个类中的两种方法,但是如果你想限制检查只能在一个特定的类function,它需要更多的工作,但这是绝对有可能的。