Python 3使用Isinstance方法的意外行为

时间:2019-02-07 17:39:07

标签: python python-3.x inheritance subclass

我看到了意外的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):
    . . . 

1 个答案:

答案 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是类,而不是它的实例,因此isinstanceFalse