Неожиданное поведение Python 3 с помощью метода isinstance - PullRequest
0 голосов
/ 07 февраля 2019

Я вижу странное поведение с методом isinstance, которое я не ожидал.Может ли кто-нибудь помочь мне определить, почему это происходит?

У меня есть модуль sandbox.py, который я использую для работы с модулями при их создании.У меня также есть класс двоичного дерева binary_tree.py и класс BST bst.py, который наследуется от реализации двоичного дерева и добавляет ограничение на сортировку дерева.У меня также есть некоторые служебные методы, которые работают с деревьями, такие как BFS, DFS и т. Д.

проблема заключается в следующем: класс Bst (узел BST) является подклассом Node (общий узел двоичного дерева).Мои служебные методы имеют некоторые проверки, чтобы убедиться, что их аргумент является экземпляром Node или его подтипа:

def bfs(n: Node, process=None):
    . . . 
    assert isinstance(n, Node)
    # print for debugging
    print("util.py:", isinstance(n, Node))
    . . . 

В методе bfs утверждение проходит со следующим вызовом, а затем печатает print:

tree = Bst("A")
bfs(tree, lambda n: print(n.data, end=' ')) # Ignore the implementation, just know this enters the method
util.py: True

Как и ожидалось.Однако в sandbox.py один и тот же вызов выводит False:

from trees.binary_tree import Node
from trees.util import *
from trees.bst import Bst

print("sandbox.py:", isinstance(Bst, Node))
sandbox.py: False

Почему isinstance возвращает две разные вещи при вызове из разных мест, даже если два аргумента имеют один и тот же класс?

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

sandbox.py
trees/
    binary_tree.py
    bst.py
    util.py

Внутри bst.py Bst определяется так:

Bst(Node):
    . . . 

1 Ответ

0 голосов
/ 07 февраля 2019
tree = Bst("A")
bfs(tree, ...)

def bfs(n, ...):
    isinstance(n, Node)

Здесь n фактически является экземпляром из Bst, подклассом Node.

from trees.bst import Bst
isinstance(Bst, Node)

Bst - это класс, а не его экземпляр, поэтому isinstance - это False.

...