为什么isinstance()不能按预期工作?

2024-09-30 08:30:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在学习关于决策树的this教程,并尝试使用spyder将其作为python项目重新创建,而不是作为笔记本

我创建了不同的py文件,在其中放置了不同的方法和类,具体来说,我创建了一个名为tree_structure的文件,其中包含以下类:Leaf、DecisionNode和Question。(我希望在一个py文件中放入更多类是正确的)

当我试图在另一个py文件的方法“classify”中使用isinstance()时,我希望为True,但它返回False:

>>>leaf0
<tree_structure.Leaf at 0x11b7c3450>
>>>leaf0.__class__
tree_structure.Leaf
>>>isinstance(leaf0,Leaf)
False
>>>isinstance(leaf0,tree_structure.Leaf)
False

leaf0是从“build_tree”方法迭代创建的(我刚刚将其保存到t0以进行调试..在执行期间未保存为变量):

t0 = build_tree(train_data)
leaf0 = t0.false_branch.false_branch 

我还尝试使用type(leaf0) is Leaf代替isinstance,但它仍然返回False

有人能解释一下为什么会这样吗

树结构.py

class Question:

    def __init__(self,header, column, value):
        self.column = column
        self.value = value
        self.header = header

    def match(self, example):
        # Compare the feature value in an example to the
        # feature value in this question.
        val = example[self.column]
        if is_numeric(val):
            return val >= self.value
        else:
            return val == self.value

    def __repr__(self):
        # This is just a helper method to print
        # the question in a readable format.
        condition = "=="
        if is_numeric(self.value):
            condition = ">="
        return "Is %s %s %s?" % (
            self.header[self.column], condition, str(self.value))

class Leaf:

    def __init__(self, rows):
        self.predictions = class_counts(rows)

class DecisionNode:

    def __init__(self,
                 question,
                 true_branch,
                 false_branch):

        self.question = question
        self.true_branch = true_branch
        self.false_branch = false_branch

分类器.py

from tree_structure import Question,Leaf,DecisionNode

def classify(row, node):

    # Base case: we've reached a leaf
    if isinstance(node, Leaf):
        print("----")
        return node.predictions

    # Decide whether to follow the true-branch or the false-branch.
    # Compare the feature / value stored in the node,
    # to the example we're considering.

    if node.question.match(row):
        print("yes")
        return classify(row, node.true_branch)
    else:
        print("no")
        return classify(row, node.false_branch)

构建树

def build_tree(rows,header):
    """Builds the tree.

    Rules of recursion: 1) Believe that it works. 2) Start by checking
    for the base case (no further information gain). 3) Prepare for
    giant stack traces.
    """


    gain, question = find_best_split(rows,header)

    print("--best question is ''{}'' with information gain: {}".format(question,round(gain,2)))

    # Base case: no further info gain
    # Since we can ask no further questions,
    # we'll return a leaf.

    if isinstance(rows,pd.DataFrame):
        rows = rows.values.tolist()

    if gain == 0:
        return Leaf(rows)

    # If we reach here, we have found a useful feature / value
    # to partition on.
    true_rows, false_rows = partition(rows, question)

    # Recursively build the true branch.
    print("\n----TRUE BRANCH----")
    true_branch = build_tree(true_rows,header)

    # Recursively build the false branch.
    print("\n----FALSE BRANCH----")
    false_branch = build_tree(false_rows,header)

    # Return a Question node.
    # This records the best feature / value to ask at this point,
    # as well as the branches to follow
    # dependingo on the answer.

    return DecisionNode(question, true_branch, false_branch)

Tags: thebuildselfbranchnodefalsetruetree

热门问题