在Python';s可调用函数并手动执行

在Python';s可调用函数并手动执行,python,python-2.x,Python,Python 2.x,使用callable()函数时,我注意到一个不一致的行为,代码如下: >>> x = 4 >>> for i in dir(x): ... if '__' in i: ... continue ... else: ... print i, callable(i) 我得到以下结果: bit_length False conjugate False denominator False imag False numerato

使用
callable()
函数时,我注意到一个不一致的行为,代码如下:

>>> x = 4
>>> for i in dir(x):
...    if '__' in i:
...        continue
...    else:
...        print i, callable(i)
我得到以下结果:

bit_length False
conjugate False
denominator False
imag False
numerator False
real False
但是手动使用
callable()
函数时:

>>> callable(x.bit_length)
True
我在这里遗漏了什么?

dir(object)
,所以基本上你所做的是
可调用(“位长度”)
,这显然是错误的(字符串不可调用)

您可能想做的是:

for name in dir(obj):
    if "__" in name:
        continue
    attr = getattr(obj, name)
    print name, callable(attr)

您正在测试名为'i'('dir'返回字符串列表)的字符串是否可调用。该字符串不可调用。您需要从名为“i”的“x”中获取属性并进行测试。

很好的解释。第一个代码对我来说很好。但是,第二个代码返回了一个
AttributeError:'int'对象没有属性'\uu dict\uuu'
,正如我所说的“如果您使用的是非内置类型,您可以这样做”。您使用的是内置类型(int是一种内置类型),因此不能使用第二种方法。我认为该代码的
\uuu dict\uuu
版本即使对于具有
\uu dict\uu
的对象也不能正常工作。在实例上,
\uuu dict\uu
只保存实例变量,而不保存类变量(如方法)。要找到它们,您需要查看所有基类的self.\uuuuuu class.\uuuuu dict.\uuuuuu和
\uuuu dict.\uuuuu
s。而且您得到的值可能不是您想要的,因为正常的属性查找使用描述符协议(这是
属性
对象的工作方式,以及方法绑定到实例的方式)。@Blckknght是的,很公平。我将删除该示例。无论如何,我并没有真正测试第二个示例。