Python 实例变量包含另一个实例 class 但为什么我不能访问该变量的实例变量

Python Instance Variable contains an instance of another class but why can't I access the instance variable of that variable

我有一个学生 class、节点 class 和树 class。基本上,我想将 Student class 的实例传递给 Node class 的实例变量。我正在尝试访问包含 Student class 实例的节点实例变量的实例变量。为什么我会收到错误消息?抱歉,我通常在 Java 中编写代码,试图理解 Python。

这是我的代码:

class Node(object):

    def __init__(self, value):
        self.left = None
        self.right = None
        self.data = value

    def __repr__(self):
        return str(self.data.__repr__)

    def __str__(self):
        return str(self.data.__str__)

class Tree(object):
    def __init__(self):
        self.root = None

    def addNode(self, node, value):
        if node is None:
            self.root = value
        else:
            if value.data.age<node.data.age:
                if node.left is None:
                    node.left = value
                else:
                    self.addNode(node.left, value)

            else: 
                if node.right is None:
                    node.right = value
                else:
                    self.addNode(node.right, value)

    def print_in_order(self, node):
        if node is not None:
            self.print_in_order(node.left)
            print(node)
            self.print_in_order(node.right)

class Student(object):
    def __init__(self, fname, lname, major, age):
        self.fname = fname
        self.lname = lname
        self.major = major
        self.age = age

    def __repr__(self):
        return "%s %s" % (self.fname, self.lname)

    def __str__(self):
        return "Student name: %s %s. Major's in %s and is %s years old" % (self.fname, self.lname, self.major, self.age)

#make student information
student1 = Student("Richard", "Nono", "Electrical Engineer", 22)
student2 = Student("Happy", "Tail", "Psychology", 19)
student3 = Student("Honda", "Make", "Mechanical Engineer", 21)
student4 = Student("John", "Ladgo", "Computer Science", 20)
student5 = Student("Remember", "Assignment", "Music", 23)

#make nodes from students
node1 = Node(student1)
node2 = Node(student2)
node3 = Node(student3)
node4 = Node(student4)
node5 = Node(student5)

#make tree and populate it witht he nodes
bts = Tree()
bts.addNode(bts.root, node1)
bts.addNode(bts.root, node2)
bts.addNode(bts.root, node3)
bts.addNode(bts.root, node4)
bts.addNode(bts.root, node5)

#print the tree
bts.print_in_order(bts.root)

我在树 class 中尝试执行 node.data.age

时遇到错误

节点 class 的实例变量 "data" 应包含学生 class 的实例。为什么我不能那样做?

这是我的主要内容:

def main():
    #make student information
    student1 = Student("Richard", "Nono", "Electrical Engineer", 22)
    student2 = Student("Happy", "Tail", "Psychology", 19)
    student3 = Student("Honda", "Make", "Mechanical Engineer", 21)
    student4 = Student("John", "Ladgo", "Computer Science", 20)
    student5 = Student("Remember", "Assignment", "Music", 23)

    #make nodes from students
    node1 = Node(student1)
    node2 = Node(student2)
    node3 = Node(student3)
    node4 = Node(student4)
    node5 = Node(student5)

    #make tree and populate it witht he nodes
    bts = Tree()
    bts.addNode(bts.root, node1)
    bts.addNode(bts.root, node2)
    bts.addNode(bts.root, node3)
    bts.addNode(bts.root, node4)
    bts.addNode(bts.root, node5)

    #print the tree
    bts.printInorder(bts.root)

main()

似乎从未定义过 node.data.age。你试过node.age吗?

class Node(Student):
    def __init__(self, value):
        self.left = None
        self.right = None
        self.data = value

当您传入值时,您正在将数据设置为值,但是没有额外保存任何内容。

希望这就是您要找的。 另外请在编写 python 代码时尽量遵循 PEP8 编码标准。

class Node(object):

    def __init__(self, value):
        self.left = None
        self.right = None
        self.data = value

    def __repr__(self):
        return self.data.__repr__()

    def __str__(self):
        return self.data.__str__()


class Tree(object):

    def __init__(self):
        self.root = None

    def add_node(self, node, value):
        if node is None:
            self.root = value
        else:
            if value.data.age < node.data.age:
                if node.left is None:
                    node.left = value
                else:
                    self.add_node(node.left, value)

            else:
                if node.right is None:
                    node.right = value
                else:
                    self.add_node(node.right, value)

    def print_in_order(self, node):

        if node is not None:
            self.print_in_order(node.left)
            print(node)
            self.print_in_order(node.right)


class Student(object):

    def __init__(self, fname, lname, major, age):
        self.fname = fname
        self.lname = lname
        self.major = major
        self.age = age

    def __repr__(self):
        return "%s %s" % (self.fname, self.lname)

    def __str__(self):
        return "Student name: %s %s. Major's in %s and is %s years old" % (self.fname, self.lname, self.major, self.age)


student1 = Student("Richard", "Nono", "Electrical Engineer", 22)
student2 = Student("Happy", "Tail", "Psychology", 19)
student3 = Student("Honda", "Make", "Mechanical Engineer", 21)
student4 = Student("John", "Ladgo", "Computer Science", 20)
student5 = Student("Remember", "Assignment", "Music", 23)

node1 = Node(student1)
node2 = Node(student2)
node3 = Node(student3)
node4 = Node(student4)
node5 = Node(student5)


bts = Tree()
bts.add_node(bts.root, node1)
bts.add_node(bts.root, node2)
bts.add_node(bts.root, node3)
bts.add_node(bts.root, node4)
bts.add_node(bts.root, node5)


bts.print_in_order(bts.root)