Пітон, створюючи об’єкти


132

Я намагаюсь вивчити python, і зараз я намагаюся розібратися з класами і як ними маніпулювати примірниками.

Я не можу зрозуміти цю практичну проблему:

Створіть та поверніть студентський об’єкт, ім’я, вік та основні значення ті ж, що і дані, що задані як введення

def make_student(name, age, major)

Я просто не розумію, що це означає під об’єктом, вони означають, що я повинен створити масив всередині функції, яка містить ці значення? або створити клас та дозволити цій функції всередині нього та призначити екземпляри? (перед цим запитанням мені запропонували створити студентський клас із прізвищем, віком та основним напрямком)

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

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

1
None (без лапок) - це загальне непризначене значення за замовчуванням у python
monkut

Відповіді:


173
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:

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.


17
чому ви ініціалізуєте їх як змінні класу до вашого init? (цікаво; ви бачили цю картину не дуже часто)
GoingTharn,

7
Для читабельності. Помістивши змінні класу вгорі до початку init, я можу швидко побачити, які змінні знаходяться в межах класу, оскільки їх не може встановити конструктор.
Wulfram

1
Тут ім'я об'єкта, який є екземпляром класу Student, залишається студентом прав? Що робити, якщо мені потрібно кілька об'єктів під час кожного дзвінка з іменем student01, student02, .. і так далі?
Яті

9
Створення змінних класів, щоб побачити, які змінні вашого примірника - жахлива практика. Будь-яким початківцям читачам: замість цього зверніться до відповіді @ pyrospade.
анон01,

2
Ваш приклад вводить в оману. Будь ласка, використовуйте назви змінних класів, які насправді є власністю всіх студентів, а не неправомірним використанням майна кожного студента. Наприклад: використовувати class Unicornі has_hooves = Trueзамість name = "".
Тім Куйперс

49

Створіть клас та вкажіть його __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__.


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

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

28

Об'єкти - це екземпляри занять. Заняття - лише креслення для об'єктів. Отже, враховуючи визначення вашого класу -

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

Власне, я вважаю за краще не робити клас Ім'я (об’єкт): з багатослівних причин. Документація Python, як правило, також не робить цього. Мені подобається "небезпечний" приклад подачі в дикту. docs.python.org/2/tutorial/classes.html
Wulfram

1
Я відкликаю свій попередній коментар. Дивіться stackoverflow.com/questions/4015417/… . Тож насправді є причина для написання назви класу (об’єкта):
Wulfram

1
У python немає конструктора :)
BigSack

Чим __init__()метод відрізняється від конструктора?
піроспада

1
__init__не є конструктором, "тому що об'єкт вже побудований до того часу, __init__як викликається, і ви вже маєте дійсне посилання на новий екземпляр класу." ( diveintopython.net/object_oriented_framework/… )
Brian Z

3

коли ви створюєте об'єкт за допомогою попереднього класу, спочатку потрібно створити змінну для зберігання цього об'єкта. Потім ви можете створити об'єкт і зберегти змінну, яку ви створили.

class Student:
     def __init__(self):

# creating an object....

   student1=Student()

Насправді цей метод init є конструктором class.you можна ініціалізувати цей метод, використовуючи деякі атрибути. У цьому пункті, створюючи об'єкт, вам доведеться передати деякі значення для конкретних атрибутів ..

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

 # creating an object.......

     student2=Student("smith",25)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.