Привет, я изучал 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
1
Noah Strong 19 Дек 2015 в 02:18

3 ответа

Лучший ответ

В общем, я думаю, что этот вопрос больше подходит для Code Review, а не для переполнения стека.

Возможно, вам следует полностью переосмыслить свой класс. Для меня это выглядит так, будто вы хотели моделировать ученика, а не класс. Что-то вроде следующего может лучше соответствовать вашим потребностям:

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())

< Сильный > Edit: Похоже, другие, такие как Prune, пришли к той же идее.

2
Community 23 Май 2017 в 10:28

Основная проблема заключается в том, что james_all является локальной переменной метода Classroom.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'
0
Prune 18 Дек 2015 в 23:39

Ваша проблема сводится к фундаментальному недоразумению о том, как работают классы. Класс - это просто шаблон (подумайте о форме печенья). Вызывая класс, вы создаете экземпляр класса. Экземпляр для класса - это то же самое, что печенье для резака печенья. Функция, которая сообщает вашему классу, как создать экземпляр, является функцией __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()

Это будет иметь тот же результат, что был показан ранее.

Вы можете спросить себя: «Но есть параметр« я », который я никогда не передаю. Python не работает?» Python работает просто отлично. Параметр self является неявным, когда вы вызываете метод в экземпляре, подобном James или Diego, но он явно указан в фактическом теле метода. Если вы хотите изменить экземпляр в методе, то вы должны изменить параметр self. Вот почему мы присваиваем ему значения в __init__. Если вы хотите узнать что-то об экземпляре, проверьте это с помощью параметра self.

3
eestrada 19 Дек 2015 в 22:42