【问题标题】:Accessing method variables of one class in another python class在另一个python类中访问一个类的方法变量
【发布时间】:2016-06-19 02:59:57
【问题描述】:

我已经开始在 python 中学习面向对象的概念。我在下面得到了这个示例代码:

 class Student(object):
   def __init__(self, name, age):
    self.name = name
    self.age = age


class School(object):
  students = []
  def __init__(self, name):
    self.name = name

  def add_student(self, student):
    self.students.append(student)

  def show_students(self):
    print("{0} Student Roster".format(self.name))
    for s in self.students:
        print("{0}: {1}".format(s.name, s.age))




my_school = School("Quora University")
first_student = Student("Rongan Li", 20)
second_student = Student("Jason Kane", 20)
my_school.add_student(first_student)
my_school.add_student(second_student)
my_school.show_students()

问题: 在 School 类的 def show_students 方法中,他们如何在没有该类实例的情况下访问类 student 的构造变量?

【问题讨论】:

  • 我认为这里有一个更深层次的问题:students 不应该是 School 对象的实例变量,而不是 class 变量吗?它的设置方式是将学生添加到任何学校将使他们看起来是所有学校的学生。至少在我看来是这样的。

标签: python python-2.7 python-3.x


【解决方案1】:
first_student = Student("Rongan Li", 20)
second_student = Student("Jason Kane", 20)

这些行创建了学生类的对象,first_student,其名称为“Rongan Li”,年龄为“20”。

名为“Jason Kane”且年龄为“20”的second_student

现在,您将这 2 个对象添加到列表中。

my_school.add_student(first_student)
my_school.add_student(second_student)

现在,当你在列表中迭代时

for s in self.students:
        print("{0}: {1}".format(s.name, s.age))

's' 转到列表的第一个元素,并且由于它是 Student 类的对象,因此 's' 成为学生类的对象。现在,由于 's' 是列表中的第一个元素,因此您首先添加了 'Rongal Li' 和 20 。所以,s 有 2 个属性 name 和 age。当您执行 s.name 时,它​​会打印 'Rongal Li' 而 s.age 会打印 20

然后它转到下一个元素并重复相同的过程。

【讨论】:

    【解决方案2】:

    在 show_students 方法中有一个 for 循环:

    for s in self.students:
        print("{0}: {1}".format(s.name, s.age))
    

    它遍历由方法 add 添加的学生列表,因此在循环内变量“s”表示学生类的实例,因此 s.name 是通过使用类的实例访问实例变量的合法方式

    【讨论】:

      【解决方案3】:

      通过add_student 方法将学生添加到School.students 列表中。

      my_school.add_student(first_student)
      my_school.add_student(second_student)
      

      这两行添加了对my_schoolSchool.students 列表的两个引用。所以现在列表有两个引用指向first_studentsecond_student

      此时您可以将my_school 中的列表视为

      students = [Pointer to first_student, Pointer to second_student]
      

      当您调用my_school.show_students()时,访问my_school.students列表(上面的列表)并通过列表中对first_studentsecond_student的引用访问原始first_student对象和second_student对象然后可以检索它们的属性。

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 2014-10-10
        • 2020-09-02
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        相关资源
        最近更新 更多