Python, создание объектов

Я пытаюсь изучить python, и теперь я пытаюсь получить виджет классов и как манипулировать ими с помощью экземпляров.

Я не могу понять эту проблему:

Создайте и верните объект-ученик, чье имя, возраст и майор те же, что указаны в качестве входных данных

def make_student(name, age, major)

Я просто не понимаю, что это означает для объекта, они означают, что я должен создать массив внутри функции, которая содержит эти значения? или создать класс и позволить этой функции быть внутри него и назначать экземпляры? (перед этим вопросом меня попросили создать класс ученика с именем, возрастом и основным внутри)

class Student:
    name = "Unknown name"
    age = 0
    major = "Unknown major"

Ответ 1

class Student(object):
    name = ""
    age = 0
    major = ""

    # The class "constructor" - It actually an initializer 
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major

def make_student(name, age, major):
    student = Student(name, age, major)
    return student

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

class Student(object):
    name = ""
    age = 0
    major = ""

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    # Note: I didn't need to create a variable in the class definition before doing this.
    student.gpa = float(4.0)
    return student

Я предпочитаю первый, но есть примеры, когда последнее может быть полезным - одно при работе с базами данных документов, такими как MongoDB.

Ответ 2

Создайте класс и дайте ему метод __init__:

class Student:
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major

    def is_old(self):
        return self.age > 100

Теперь вы можете инициализировать экземпляр класса Student:

>>> s = Student('John', 88, None)
>>> s.name
    'John'
>>> s.age
    88

Хотя я не уверен, зачем вам нужна функция make_student student, если она делает то же самое, что и Student.__init__.

Ответ 3

Объекты - это экземпляры классов. Классы - это всего лишь чертежи для объектов. Поэтому, учитывая ваше определение класса -

# Note the added (object) - this is the preferred way of creating new classes
class Student(object):
    name = "Unknown name"
    age = 0
    major = "Unknown major"

Вы можете создать функцию make_student, явно назначив атрибуты новому экземпляру Student -

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    return student

Но, вероятно, имеет смысл сделать это в конструкторе (__init__) -

class Student(object):
    def __init__(self, name="Unknown name", age=0, major="Unknown major"):
        self.name = name
        self.age = age
        self.major = major

Конструктор вызывается при использовании Student(). Он примет аргументы, определенные в методе __init__. Теперь подпись конструктора будет Student(name, age, major).

Если вы используете это, то функция make_student тривиальна (и лишняя) -

def make_student(name, age, major):
    return Student(name, age, major)

Для развлечения здесь приведен пример создания функции make_student без определения класса. Пожалуйста, не пробуйте это дома.

def make_student(name, age, major):
    return type('Student', (object,),
                {'name': name, 'age': age, 'major': major})()