Чому конструктори справді називаються "Конструктори"?
Конструктор (названий __new__) створює та повертає новий екземпляр класу. Отже C.__new__метод класу є конструктором для класу C.
Метод C.__init__екземпляра викликається в конкретному екземплярі після його створення, щоб ініціалізувати його, перш ніж передати його абоненту. Тож цей метод є ініціалізатором для нових екземплярів C.
Чим вони відрізняються від методів у класі?
Як зазначено в офіційній документації __init__ , викликається після створення екземпляра . Інші методи цього лікування не отримують.
Яке їх призначення?
Мета конструктора C.__new__- визначити власну поведінку під час побудови новогоC екземпляра.
Мета ініціалізатора C.__init__- визначити власну ініціалізацію кожного екземпляра Cпісля його створення.
Наприклад, Python дозволяє:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Але якщо ви хочете, щоб кожен екземпляр Testмав атрибут, xрівний 10, ви можете помістити цей код всередині __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Кожен метод екземпляра (метод, який викликається певним екземпляром класу) отримує екземпляр як перший аргумент. Цей аргумент умовно названо self.
Методи класу, такі як конструктор __new__, натомість отримують клас як перший аргумент.
Тепер, якщо ви хочете користувацькі значення для xатрибута, все, що вам потрібно зробити, це передати це значення як аргумент __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Сподіваюся, це допоможе вам усунути деякі сумніви, і оскільки ви вже отримали хороші відповіді на інші запитання, я зупинюсь тут :)
__init__є ініціалізатором . Пітон конструктор є__new__. Python використовує автоматичну двофазну ініціалізацію -__new__повертає дійсний, але (як правило) незаселений об'єкт (див.boolЗустрічний приклад), який потім__init__автоматично закликає його. Це дозволяє уникнути проблем з такими мовами, як C ++, з частково побудованими об'єктами - у Python у вас ніколи немає (хоча це може бути частково ініціалізовано). Ви майже ніколи не будете потребувати перекриття як на уроці, так__new__і__init__на ньому.