在Python中有没有一种方法可以查看类是否响应某个方法?就像Ruby中的方法一样:
class Fun
def hello
puts 'Hello'
end
end
fun = Fun.new
puts fun.respond_to? 'hello' # true
还有没有一种方法可以查看方法需要多少个参数?
嗯... 我认为 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中定义可选/默认参数和可变参数函数和方法的简易性,似乎知道函数的“必需”参数数量在编程/内省角度上是非常有限的价值。
方法:
func = getattr(Fun, "hello", None)
if callable(func):
...
参数个数:
import inspect
args, varargs, varkw, defaults = inspect.getargspec(Fun.hello)
arity = len(args)
varargs
和/或varkw
不是None,则arity可以是几乎任何东西。dir(instance)
返回一个对象的属性列表。
getattr(instance,"attr")
返回一个对象的属性。
callable(x)
如果x是可调用的,则返回True。
class Fun(object):
def hello(self):
print "Hello"
f = Fun()
callable(getattr(f,'hello'))
hasattr()
函数不能判断属性是否为方法(即可调用的)。 - log0我不是 Ruby 专家,所以我不确定这是否回答了你的问题。我认为你想检查一个对象是否包含某个方法。有很多种方法可以做到这一点。你可以尝试使用 hasattr()
函数来查看对象是否具有该方法:
hasattr(fun, "hello") #True
或者你可以遵循 Python 指南中的不要问能不能问,直接问的方式,所以当对象没有该方法时,只需捕获抛出的异常即可:
try:
fun.hello2()
except AttributeError:
print("fun does not have the attribute hello2")
callable
呢? - errorhandlercallable(getattr(Fun,"hello", None))
。getattr
的第三个参数是一个默认值,如果对象没有该属性,则返回该值。 - Katriel__init__
中生成实例方法并不是很常见。这取决于使用情况。 - Katriel