[英]Trying to learn python classes
嘿,所以我一直在学习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
您的问题归结为对类如何工作的根本误解。 一个类仅仅是一个模板(想像一个饼干模子的形状)。 通过调用该类,您正在创建该类的实例。 对于类来说,实例对于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()
这将具有与先前显示的输出相同的输出。
您可能会问自己:“但是有一个我从未传入的'self'参数。Python是否损坏了?” Python运行正常。 当您在James
或Diego
这样的实例上调用方法时, self
参数是隐式的,但在该方法的实际主体中则是显式的。 如果要在方法中修改实例,则必须修改self
参数。 这就是为什么我们在__init__
为其分配值。 如果要查找有关实例的内容,请在self
参数上进行检查。
总的来说,我认为该问题更适合代码审查而不是堆栈溢出。
也许您应该完全重新考虑您的课程。 对我来说,它看起来很像您要为学生而不是教室建模的模型。 以下内容可能会更适合您的需求:
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这样的人也提出了相同的想法。
中心问题是james_all是Classroom.James方法的局部变量。 它不是类的属性。 除非您使用James方法,否则它没有任何用处。
在print_student中 ,将其作为参数,但是当您从主程序中调用print_student时,没有提供参数。
也许您正在寻找教室中学生的一般财产? 有一个方法可以初始化类的对象,并在创建新实例时将定义的值传递给该对象。
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()
输出:
15, 9, 'James Herbert'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.