使用isinstance()给我True,使用type()在Python中给我False

时间:2013-08-05 10:59:59

标签: python

虽然我在尝试解决某个问题,但是我正面临着一些我不知道如何克服的问题。

我需要在一个类中编码一个方法,它代表一个矩阵,这个方法用于vector_matrix乘法,现在教师为我们提供了一个代表Class的代码并且它包含了类的定义,我们的职责是完成一些程序(方法)

我正在工作的代码是vector_matrix_mul(v,M),其中v是向量,M是一个矩阵,这个方法将在我们正在设计的Class Mat中,现在我写了一个代码,它运行良好在我的电脑上,但问题是。

Class Mat有以下方法。

def __rmul__(self, other):
    if Vec == type(other):
        return vector_matrix_mul(other, self)
    else:  # Assume scalar
        return scalar_mul(self, other)

这里Vec是一个向量类,现在为了我的方法vector_matrix_mul(其他,self)在必须为True之前执行条件,但我得到它False所以程序运行到else :部分并执行其他程序。

我试图用条件包含type()替换,所以上面的代码变成如下:

def __rmul__(self, other):
    if isinstance(other, Vec):
        return vector_matrix_mul(other, self)
    else:  # Assume scalar
        return scalar_mul(self, other)

并且代码正常工作,所以现在我不知道如何避免这个问题,在测试我的程序时,if Vec == type(other):给Class Vec的所有实例赋予False,是否存在获取Vec == type(other)的结果的方法:如果isinstance(其他,Vec)类似于条件的结果:??

如果Vec == type(other),则提出条件

或任何建议:给予True。

一个注意事项:我正在使用Python 3.2.3,而评分者正在使用Python 3.3.2

感谢。

1 个答案:

答案 0 :(得分:3)

isinstance()测试该类型的或子类

不要使用== type(..);你会改用issubclass()

issubclass(type(other), Vec)

但是isinstance()要好得多,因为它避免了首先要查找类型。

最后但并非最不重要的是,类型是单身,对is身份的测试会稍微好一些:

Vec is type(other)

但不是更好。

请注意,对于旧样式类(任何不从object继承的内容)type()都不会返回该类,而是<type 'instance'>而不是other.__class__。你必须使用isinstance()代替。 >>> class Foo: pass ... >>> f = Foo() >>> type(f) <type 'instance'> >>> f.__class__ <class __main__.Foo at 0x1006cb2c0> >>> type(f) is Foo False >>> f.__class__ is Foo True >>> isinstance(f, Foo) True 正确处理了这种情况:

{{1}}