繁体   English   中英

尝试学习python类

[英]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运行正常。 当您在JamesDiego这样的实例上调用方法时, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM