是否可以查看某个类是否响应Python中的方法?比如红宝石:
class Fun
def hello
puts 'Hello'
end
end
fun = Fun.new
puts fun.respond_to? 'hello' # true
还有办法查看该方法需要多少个参数吗?
答案 0 :(得分:17)
嗯......我认为hasattr
和callable
是实现同一目标的最简单方法:
class Fun:
def hello(self):
print 'Hello'
hasattr(Fun, 'hello') # -> True
callable(Fun.hello) # -> True
当然,您可以在异常处理套件中调用callable(Fun.hello)
:
try:
callable(Fun.goodbye)
except AttributeError, e:
return False
关于所需参数数量的内省;我认为这对语言来说具有可疑的价值(即使它存在于Python中),因为这不会告诉你所需的语义。鉴于可以轻松定义可选/缺省的参数以及Python中的变量参数函数和方法,似乎知道函数的“必需”参数数量的价值非常小(从程序/内省的角度来看)。
答案 1 :(得分:8)
有方法:
func = getattr(Fun, "hello", None)
if callable(func):
...
元数:
import inspect
args, varargs, varkw, defaults = inspect.getargspec(Fun.hello)
arity = len(args)
请注意,如果varargs
和/或varkw
不是无,则arity几乎可以是任何内容。
答案 2 :(得分:2)
dir(instance)
返回对象属性列表
getattr(instance,"attr")
返回对象的属性
如果x可以调用,则callable(x)
返回True。
class Fun(object):
def hello(self):
print "Hello"
f = Fun()
callable(getattr(f,'hello'))
答案 3 :(得分:1)
我不是Ruby专家,所以我不确定这是否能回答你的问题。我想你想检查一个对象是否包含一个方法。有很多方法可以做到这一点。您可以尝试使用hasattr()
函数,查看对象是否具有该方法:
hasattr(fun, "hello") #True
或者你可以按照python指南不要问,只要问这样,只要抓住当对象没有方法时抛出的异常:
try:
fun.hello2()
except AttributeError:
print("fun does not have the attribute hello2")