我已经开始在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 class的def show_students方法中,他们如何在没有该类实例的情况下访问类student的构造变量?
答案 0 :(得分:0)
在方法show_students中有一个for循环:
for s in self.students:
print("{0}: {1}".format(s.name, s.age))
它循环遍历由方法添加的学生列表,因此在循环内部变量" s"表示学生类的实例,因此s.name是通过使用类的实例访问实例变量的合法方式
答案 1 :(得分:0)
通过School.students
方法将学生添加到add_student
列表中。
my_school.add_student(first_student)
my_school.add_student(second_student)
这两行在School.students
中添加了对my_school
列表的两个引用。现在,列表中有两个引用指向first_student
和second_student
。
此时您可以将my_school
中的列表视为
students = [Pointer to first_student, Pointer to second_student]
当您致电my_school.show_students()
时,会访问my_school.students
列表(上面的列表),并通过列表中first_student
和second_student
的引用访问原始{ {1}}对象和first_student
对象,然后可以检索它们的属性。
答案 2 :(得分:0)
first_student = Student("Rongan Li", 20)
second_student = Student("Jason Kane", 20)
这些行创建了学生班级的对象,first_student,其名称为“Rongan Li'和年龄' 20'。
second_student的名字' Jason Kane'和年龄' 20'
现在,您将这两个对象添加到列表中。
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'成为学生班的对象。现在,因为'是列表中的第一个元素,并且在第一个位置添加了“Rongal Li'和20。所以,s有2个属性名称和年龄。当你做s.name时,会打印出“Rongal Li”字样。和s.age打印20
然后转到下一个元素并重复相同的过程。