Я вижу странное поведение с методом 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):
. . .