我想创建一个函数来检测给定实例是否存在方法,可以传入的参数是什么,然后使用适当的参数调用该方法。我是新手,我不知道该怎么做:(
答案 0 :(得分:3)
尝试hasattr
>>> help(hasattr)
Help on built-in function hasattr in module __builtin__:
hasattr(...)
hasattr(object, name) -> bool
Return whether the object has an attribute with the given name.
(This is done by calling getattr(object, name) and catching exceptions.)
有关inspect
模块的更高级内省,请阅读
但首先,请告诉我们您为什么需要这个。有99%的可能存在更好的方式......
答案 1 :(得分:1)
Python支持duck typing - 只需在实例上调用方法。
答案 2 :(得分:0)
您是否尝试将参数值与具有未知签名的函数对齐?
您如何匹配参数值和参数变量?猜?
你必须使用某种名称匹配。
例如类似的东西。
someObject.someMethod( thisParam=aValue, thatParam=anotherValue )
喔。等待。这已经是Python的一流部分了。
但如果该方法不存在(出于莫名其妙的原因)该怎么办。
try:
someObject.someMethod( thisParam=aValue, thatParam=anotherValue )
except AttributeError:
method doesn't exist.
答案 3 :(得分:0)
class Test(object):
def say_hello(name,msg = "Hello"):
return name +' '+msg
def foo(obj,method_name):
import inspect
# dir gives info about attributes of an object
if method_name in dir(obj):
attr_info = eval('inspect.getargspec(obj.%s)'%method_name)
# here you can implement logic to call the method
# using attribute information
return 'Done'
else:
return 'Method: %s not found for %s'%(method_name,obj.__str__)
if __name__=='__main__':
o1 = Test()
print(foo(o1,'say_hello'))
print(foo(o1,'say_bye'))
我认为 inspect
模块对您有很大帮助。
上述代码中使用的主要功能是 dir,eval,inspect.getargspec
。您可以在python docs中获得相关帮助。