当完全限定的对象类与限定类

时间:2016-07-21 21:33:03

标签: python python-2.7

当第三方库方法使用isinstance()将对象与类进行比较时,它返回False,因为它将对象的完全限定类名与启动的合格类名进行比较&# 34;更高"起来。

例如:isinstance()发现对象类和类名不同:

预期:

  

' network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage'

实测值:

  

'的后端 .network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage'

并在给定代码段的情况下返回False

if not isinstance(value, self.type):
      raise ValidationError('Expected type %s for field %s, '
                            'found %s (type %s)' %
                            (self.type, name, value, type(value)))

有没有办法更改类的完全限定名称(至少暂时)?

2 个答案:

答案 0 :(得分:4)

要使其返回True,isinstance的第一个参数必须是第二个的实例。为两个参数提供相同的类会导致False:

>>> isinstance( int, int)
False
>>> isinstance( int(1), int)
True

这里,int是一个类,而一个类不是类的实例。

相比之下,

int(1)是一个整数(int的实例)。因此,第二个示例返回True。

姓名资格

让我们在应用于限定名称和非限定名称时比较isinstance

>>> import numpy
>>> from numpy import bool
>>> isinstance( numpy.bool, bool)
False
>>> isinstance( bool, numpy.bool)
False
>>> isinstance( bool(1), numpy.bool)
True
>>> isinstance( numpy.bool(1), bool)
True

名称限定不会影响结果。

答案 1 :(得分:4)

就Python而言,类network.mhistory.service.mhistory_messages.MHistoryActivityViewMessagebackend.network.mhistory.service.mhistory_messages.MHistoryActivityViewMessage并不相同。即使它们具有完全相同的定义也是如此,因为它们是从同一个文件中读取的!

你的错误不是isinstance返回“错误”的答案,而是你能够通过两个不同的名称访问这两个类(也可能是其他类)。

导致该错误的问题可能有两个。首先,你可能在某处乱用了sys.path。这本身并不坏,但是通过使backend包的内容以两种不同的方式提供,首先直接(例如import network)和backend({{1 }})。你不想要这个。

您的错误的第二部分(可能是导致第一部分的激励因素)是,您实际上使用两种方式访问​​这些对象。你只需要一个,因此应该以错误的方式修复导入包的部分。