试图学习python类

时间:2015-12-18 23:18:22

标签: python class python-3.x

嘿所以我一直在学习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

3 个答案:

答案 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工作得很好。当您在selfJames等实例上调用方法时,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()