Что __init__ и self делают на Python? - PullRequest
674 голосов
/ 09 марта 2009

Я изучаю язык программирования Python и наткнулся на то, что не до конца понимаю.

В методе, подобном:

def method(self, blah):
    def __init__(?):
        ....
    ....

Что делает self? Что это значит? Это обязательно?

Что делает метод __init__? Зачем это нужно? (И т.д.).

Я думаю, что они могут быть ООП-конструкциями, но я не очень много знаю.

Ответы [ 18 ]

14 голосов
/ 23 сентября 2012

По сути, вам нужно использовать ключевое слово «self» при использовании переменной в нескольких функциях в одном классе. Что касается init , он используется для установки значений по умолчанию, если никакие другие функции из этого класса не вызываются.

12 голосов
/ 09 марта 2009

'self' является ссылкой на экземпляр класса

class foo:
    def bar(self):
            print "hi"

Теперь мы можем создать экземпляр foo и вызвать для него метод, в этом случае Python добавляет параметр self:

f = foo()
f.bar()

Но его также можно передать, если вызов метода не находится в контексте экземпляра класса, код ниже делает то же самое

f = foo()
foo.bar(f)

Интересно, что имя переменной 'self' - это просто соглашение. Приведенное ниже определение будет работать точно так же. Сказав, что это очень строгое соглашение , которому следует следовать всегда , но оно говорит о гибкой природе языка

class foo:
    def bar(s):
            print "hi"
8 голосов
/ 19 апреля 2018

Просто демо на вопрос.

class MyClass:

    def __init__(self):
        print('__init__ is the constructor for a class')

    def __del__(self):
        print('__del__ is the destructor for a class')

    def __enter__(self):
        print('__enter__ is for context manager')
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('__exit__ is for context manager')

    def greeting(self):
        print('hello python')


if __name__ == '__main__':
    with MyClass() as mycls:
        mycls.greeting()

$ python3 class.objects_instantiation.py
__init__ is the constructor for a class
__enter__ is for context manager
hello python
__exit__ is for context manager
__del__ is the destructor for a class
8 голосов
/ 02 июля 2016
# Source: Class and Instance Variables
# https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

class MyClass(object):
    # class variable
    my_CLS_var = 10

    # sets "init'ial" state to objects/instances, use self argument
    def __init__(self):
        # self usage => instance variable (per object)
        self.my_OBJ_var = 15

        # also possible, class name is used => init class variable
        MyClass.my_CLS_var = 20


def run_example_func():
    # PRINTS    10    (class variable)
    print MyClass.my_CLS_var

    # executes __init__ for obj1 instance
    # NOTE: __init__ changes class variable above
    obj1 = MyClass()

    # PRINTS    15    (instance variable)
    print obj1.my_OBJ_var

    # PRINTS    20    (class variable, changed value)
    print MyClass.my_CLS_var


run_example_func()
8 голосов
/ 26 августа 2015

В этом коде:

class Cat:
    def __init__(self, name):
        self.name = name
    def info(self):
        print 'I am a cat and I am called', self.name

Здесь __init__ действует как конструктор для класса, и когда создается объект, вызывается эта функция. self представляет экземпляр объекта.

c = Cat('Kitty')
c.info()

Результат приведенных выше утверждений будет следующим:

I am a cat and I am called Kitty
5 голосов
/ 25 октября 2017

Python __init__ и self что они делают?

Что делает self? Что это значит? Это обязательно?

Что делает метод __init__? Зачем это нужно? (И т.д.).

Данный пример неверен, поэтому позвольте мне создать правильный пример на его основе:

class SomeObject(object):

    def __init__(self, blah):
        self.blah = blah

    def method(self):
        return self.blah 

Когда мы создаем экземпляр объекта, вызывается __init__ для настройки объекта после его создания. То есть, когда мы вызываем SomeObject с 'blah' ниже (что может быть чем угодно), он передается функции __init__ в качестве аргумента, blah:

an_object = SomeObject('blah')

Аргумент self является экземпляром SomeObject, который будет присвоен an_object.

Позже мы можем захотеть вызвать метод для этого объекта:

an_object.method()

Выполнение точечного поиска, то есть an_object.method, привязывает экземпляр к экземпляру функции, и метод (как было сказано выше) теперь является «связанным» методом - это означает, что нам не нужно явно передавать экземпляр для вызова метода.

Вызов метода получает экземпляр, потому что он был связан с точечным поиском, а при вызове выполняет любой код, который был запрограммирован для выполнения.

Неявно переданный аргумент self называется self по соглашению. Мы могли бы использовать любое другое допустимое имя Python, но другие программисты Python, скорее всего, откажутся от него и будут перенимать его, если вы измените его на другое.

__init__ - это специальный метод, , документированный в документации Python для модели данных . Он вызывается сразу после создания экземпляра (обычно через __new__ - хотя __new__ не требуется, если вы не наследуете неизменяемый тип данных).

4 голосов
/ 21 октября 2017

Что делает self ? Что это значит ? обязательно ?

Первым аргументом каждого метода класса, включая init, всегда является ссылка на текущий экземпляр класса s. По соглашению этот аргумент всегда называется self. В методе init self ссылается на вновь созданный объект; в других методах класса он ссылается на экземпляр, метод которого был вызван.

Python не заставляет вас использовать" self ". Вы можете дать ему любое имя. Но помните, что первый аргумент в определении метода - это ссылка на объект. Python добавляет в список аргумент self; вам не нужно включать его при вызове методов. если вы не указали self в методе init, вы получите ошибку

TypeError: __init___() takes no arguments (1 given)

Что делает метод init ? Зачем это нужно? (И т.д.).

init short для инициализации. Это конструктор, который вызывается при создании экземпляра класса, и не требуется . Но обычно мы пишем метод init для установки состояния объекта по умолчанию. Если вы не желаете изначально устанавливать какое-либо состояние объекта, вам не нужно писать этот метод.

3 голосов
/ 13 августа 2015

Здесь парень написал довольно хорошо и просто: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/

Прочитайте ссылку выше, как ссылку на это:

self? Так что же с этим параметром self для всех клиентов методы? Что это? Да ведь это, конечно, случай! Поставить другой Кстати, такой метод, как снять, определяет инструкции для снятия деньги со счета какого-то абстрактного клиента. призвание jeff.withdraw (100.0) помещает эти инструкции для использования на jeff экземпляр.

Так что, когда мы говорим, что отозвать (себя, количество): мы говорим, "вот как вы снимаете деньги с объекта Customer (который мы будем называть self) и долларовая цифра (которую мы назовем суммой). Я является примером Клиент, который снимает деньги, вызывается. Это не я делаю Аналогий тоже нет. jeff.withdraw (100.0) это просто сокращение для Customer.withdraw (jeff, 100.0), что совершенно правильно (если не часто видно) код.

init self может иметь смысл для других методов, но как насчет init ? Когда мы вызываем init , мы находимся в процессе создания объекта, так как же может существовать самость? Python позволяет нам расширять паттерн самости, когда объекты строятся, хотя это не совсем подходит. Просто представьте, что Джефф = Клиент ('Джефф Knupp ', 1000.0) - это то же самое, что вызов jeff = Customer (jeff,' Jeff Кнупп, 1000.0); Джефф, который был передан, также является результатом.

Вот почему, когда мы вызываем init , мы инициализируем объекты, говоря такие вещи, как self.name = имя. Помните, так как «я» является примером, это эквивалентно высказыванию jeff.name = name, которое совпадает с jeff.name = 'Джефф Кнупп. Аналогично, self.balance = баланс одинаков как jeff.balance = 1000.0. После этих двух строк мы рассмотрим Объект клиента «инициализирован» и готов к использованию.

Будьте осторожны, что вы __init__

После завершения init вызывающая сторона может правильно предположить, что Объект готов к использованию. То есть после jeff = Customer («Джефф Кнупп», 1000.0), мы можем начать вносить и снимать звонки на jeff; Джефф - полностью инициализированный объект.

...