2015-06-02 2 views
0

Я использую Django с Python3. Там есть класс, определенный в модели:Python isinstance (var, Type) всегда возвращает False

class PeopleAround(models.Model): 
    aaa_Id = models.ForeignKey(Board) 
    bbb = models.CharField(max_length=40) 
    ccc_Id = models.CharField(max_length=20) 
    ddd_Id = models.CharField(max_length=20) 

в представлении, я успешно получены некоторые данные по следующим:

peopleAroundInDb = PeopleAround.objects.filter(aaa_Id=0).all() 

и когда делать тестирование, что меня удивило это выражение ниже всегда вернуться Ложные:

isinstance(peopleAroundInDb[0], models.PeopleAround.__class__) 

, а также протестирована с равенством для:

id(PeopleAround.__class__) and id(type(peopleAroundInDb[0])) 

тоже NOT единый.

, чтобы любой мог помочь?

+0

Shouldbt использовать __class__ вместо этого использовать Фактическое имя класса –

ответ

4

Не используйте __class__ - так как это возвращает объект типа.

Просто сделайте это:

isinstance(peopleAroundInDb[0], models.PeopleAround) 

Пример:

>>> isinstance('text', str.__class__) 
False 
>>> isinstance('text', str) 
True 

Python не нуждается в объекте типа класса для сравнения, он хочет, чтобы сравнить с самим классом.

EDIT:

Это технически работает:

>>> class test: 
...  def blah(self, thing): 
...   print(isinstance(thing, self.__class__)) 
...   print(isinstance(thing, test)) 
... 
>>> a = test() 
>>> b = test() 
>>> a.blah(b) 
True 
True 

Но я бы сказал, что это яснее, и, следовательно, лучше, чтобы использовать isinstance(thing, test) над isinstance(thing, self.__class__)

+0

, но это правильное использование: '(isinstance (other, self .__ class __)'? – Shawn

+0

@Shawn в этом случае да (по крайней мере технически) - вы получаете класс текущего экземпляра, а не тип _class_ текущего экземпляра (помните, что классы Python тоже являются объектами, и как таковые являются экземплярами другого класса - с именем «metaclass» -, который по умолчанию является классом 'type'). –

+0

@Shawn, см. Мое редактирование. Технически это работает, но просто проще использовать имя класса вместо 'self .__ class__'. – Scironic

Смежные вопросы