嘿所以我一直在学习python 3.5,我希望能帮助我上课。我写了一个这样的课程,但我不知道如何让它返回我要求的价值。
我已将该课程分配给变量,但我无法按照我的意愿进行操作。
提前致谢!
class Classroom(object):
def James():
name_james = 'James Herbert'
age_james = '15'
grade_james = '9'
james_all = (age_james, grade_james, name_james)
def print_student(self, james_all):
self.james_all = james_all
print (self.james_all)
x = Classroom()
x.print_student
答案 0 :(得分:3)
你的问题归结为对课程如何运作的根本误解。一个类只是一个模板(想想一个cookie切割器的形状)。通过调用该类,您将创建该类的实例。一个实例是一个类,cookie是一个cookie切割器。告诉您的类如何创建实例的函数是__init__
函数。所以当你打电话时:
x = Classroom()
为__init__
调用Classroom
函数会发生什么。你可能会问"但是我没有为这个课程编写__init__
函数,那么它是如何工作的?"简单地说, python中的所有类都将自动从object
类继承,即使它们没有在中显式编码,这意味着它们使用它的方法,除非你明确地用它们覆盖它们你自己。 object
有一个非常简单的__init__
,几乎没有做任何事情。
回到饼干切割器的比喻,就像你可以从同一个饼干切割器制作不同口味的饼干(例如巧克力片,燕麦片,花生酱)一样,当你实例化它们时,类也会产生不同的实例具有不同的参数。像这样(改编自@ Prune'答案):
class Student(object):
def __init__(self, name, age, grade):
self.name = name
self.age = age
self.grade = grade
def print_student(self):
print (self.age, self.grade, self.name)
James = Student('James Herbert', 15, 9)
James.print_student()
Diego = Student('Diego Heriberto', 14, 9)
Diego.print_student()
哪个应该打印出来:
15 9 James Herbert
14 9 Diego Heriberto
每个实例都是不同的,因此行为不同,但它们都遵循该类布局的相同模板。
如果你想要一个Classroom
课程,你可以这样做:
class Classroom(object):
def __init__(self):
# create a list to hold students and assign the list to self
self.students = list()
def add_student(self, student):
self.students.append(student)
def print_students(self):
# use a loop to print out all the students in the classroom instance
for stud in self.students:
stud.print_student()
cr = Classroom()
James = Student('James Herbert', 15, 9)
Diego = Student('Diego Heriberto', 14, 9)
cr.add_student(James)
cr.add_student(Diego)
cr.print_students()
这与先前显示的输出具有相同的输出。
你可能会问自己"但是有自我'我从未传入的参数.Pix是否已损坏?" Python工作得很好。当您在self
或James
等实例上调用方法时,Diego
参数是隐式的,但它在方法的实际主体中是显式的。如果要在方法中修改实例,则必须修改self
参数。这就是我们在__init__
中为其分配值的原因。如果要查找有关实例的内容,请在self
参数上进行检查。
答案 1 :(得分:2)
一般来说,我认为这个问题更适合Code Review而不是Stack Overflow。
也许你应该完全重新考虑你的课程。对我来说,它看起来很像你想模仿学生而不是教室。以下内容可能会更好地满足您的需求:
class Student(object):
"""A class to model students"""
def __init__(self, age, grade, name):
self.age = age
self.grade = grade
self.name = name
def get_all_information(self):
"""Get all information about the student"""
return (self.age, self.grade, self.name)
james = Student(15, 9, 'James Herbert')
print(james.get_all_information())
修改强> 似乎像Prune这样的其他人想出了同样的想法。
答案 2 :(得分:0)
核心问题是james_all是 Classroom.James 方法的局部变量。它不是该类的属性。除非你在 James 方法中,否则它没有用处。
在 print_student 中,您将其设为参数,但是当您从主程序中调用 print_student 时,您没有提供参数。
也许您正在寻找课堂上学生的一般财产? 有一个方法来初始化类的对象,并在创建新实例时将定义值传递给它。
RDORecurrencePatterm.GetOccurence
输出:
class Student(object):
def __init__(self, name, age, grade):
self.name = name
self.age = age
self.grade = grade
def print_student(self):
print (self.age, self.grade, self.name)
James = Student('James Herbert', 15, 9)
James.print_student()