Python - isinstance () не работает, как я ожидал - PullRequest
0 голосов
/ 23 мая 2018

У меня есть класс с именем Route (со своей собственной функцией __repr __ ()) и экземпляр Route с именем default_route.Однако, если я вызываю isinstance (default_route, Route), он неожиданно возвращает False, а именно:

[Dbg]>>> default_route
Route(office(235)=323-654-3242)
[Dbg]>>> isinstance(default_route,Route)
False
[Dbg]>>> default_route.__class__
<class 'route.Route'>
[Dbg]>>> Route
<class 'route.Route'>
[Dbg]>>> type(default_route)
<class 'route.Route'>
[Dbg]>>> type(default_route) is Route
False

Определение класса действительно простое и несложное:

class Route(object):
    def __init__(self, phone, condition=None):
        self.phone=phone
        self.condition=condition
        self.choice_name=None

Я простосбит с толку этим;почему isinstance () не возвращает True выше?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я почти уверен, что это была проблема с отладчиком, который я использовал (Pythonwin);независимо от того, сколько раз я перезагружал и перезапускал свой код в этом экземпляре отладчика, проблема была полностью устойчивой, и, поскольку я находился в процессе отладки своего кода, я был озадачен тем, что делатьследующий.Однако, учитывая некоторые из приведенных выше комментариев о перезагрузке, я начал подозревать, что что-то может быть не так с самой средой отладки, поэтому я закрыл программу, снова открыл ее, и внезапно проблема перестала воспроизводиться.

Извинитебеспокоить всех, но, по крайней мере, если кто-то увидит ту же проблему, возможно, это заставит их понять, что они не сумасшедшие, и что сам Python не сломан каким-то тонким способом!

0 голосов
/ 23 мая 2018

Это может легко произойти, если вы сделали следующее:

  1. import route и создаете default_route, используя route.Route
  2. Invoke reload(route), чтобы внести некоторые изменения кодак модулю (или просто для развлечения; не имеет значения, если модуль не изменился, reload все равно перезагрузит его)

Вы можете столкнуться с этим аналогичным образом, если default_route также былопределено в route, и вы сделали from route import Route, затем reload -ed route, затем сделали from route import default_route (порядок импорта Route и default_route не имеет значения, если произошел reloadмежду ними и старым не было переоформлено).В любом случае, у вас есть экземпляр и класс из немного разных версий модуля;они могут выглядеть одинаково, иметь одинаковое поведение и т. д., но они не являются одним и тем же модулем и, следовательно, не одинаковыми классами, экземплярами и т. д.

В любом случае быстрая проверка состояла бы в вызовеdefault_route.__class__ is Route;если он оценивается как True, возможно, у вас есть какой-то странный ABC основанный класс с ломаным __subclasshook__, но, скорее всего, он будет оцениваться до False, указывая, что два класса, несмотря на совпадающее имя, на самом деле происходит от независимых загрузок модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...