2013-02-26 4 views
83

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

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

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

def make_student(name, age, major) 

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

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

Прочитайте модели данных документов, в частности, '__init__' метод актуален здесь: http://docs.python.org/2/reference/datamodel.html#object.__init__ – wim

+0

None (без кавычек) не является общее значение * unassigned * default в python – monkut

ответ

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

    # The class "constructor" - It's 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 ,

+9

почему вы инициализируете их как переменные класса до вашего init? (любопытно, не видели этот шаблон очень часто) – GoingTharn

+2

Для удобства чтения. Поместив переменные класса рядом с вершиной до init, я могу быстро увидеть, какие переменные находятся в области класса, так как они могут не все устанавливаться конструктором. – Wulfram

+1

Здесь имя объекта, являющегося экземпляром класса Student, будет оставаться студентом в порядке? Что делать, если я хочу, чтобы на каждом вызове было несколько объектов с именем student01, student02 и т. Д.? – Yathi

35

Создать класс и дать ему __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.__init__.

+0

Наш учитель дал нам программу test.py, которая проверяет, правильно ли мы сделали проблемы. Вопрос требует, чтобы я специально использовал функцию make_student. Конечная цель: s1 = make_student (имя, возраст, майор) , и теперь у меня есть все, что назначено s1. Но опять же я не уверен, что они хотят s1? Я могу сделать это с помощью массива {'name': name..etc}, но это не дало мне правильного ответа, поэтому я предполагаю, что мне нужно реализовать то, что я узнал из классов и экземпляров. –

+0

Так называемый «заводский метод» «шаблон, тот, в котором вы используете метод или функцию для создания какого-либо объекта вместо того, чтобы создавать их непосредственно в коде, является полезным шаблоном, он позволяет вам, например, использовать приятные вещи о наследовании. Посмотрите его;) – bracco23

10

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

# 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})() 
+0

На самом деле, я предпочитаю не выполнять класс Имя (объект): по причинам. Документация Python также не делает этого. Мне нравится «опасный» пример питания в дикторе. http://docs.python.org/2/tutorial/classes.html – Wulfram

+0

Я снимаю свой предыдущий комментарий. См. Http://stackoverflow.com/questions/4015417/python-class-inherits-object. Итак, на самом деле есть причина, чтобы написать класс Name (object): – Wulfram

+1

В python нет конструктора :) – BigSack

Смежные вопросы