我看到了意外的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方法中,断言将通过以下调用传递,然后打印输出:
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):
. . .
答案 0 :(得分:5)
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
。