Какова цель слова «я» в Python? - PullRequest
1013 голосов
/ 26 апреля 2010

Какова цель слова self в Python? Я понимаю, что это относится к конкретному объекту, созданному из этого класса, но я не понимаю, почему его нужно явно добавлять в каждую функцию в качестве параметра. Для иллюстрации, в Ruby я могу сделать это:

class myClass
    def myFunc(name)
        @name = name
    end
end

Что я понимаю, довольно легко. Однако в Python мне нужно включить self:

class myClass:
    def myFunc(self, name):
        self.name = name

Кто-нибудь может рассказать мне об этом? Это не то, с чем я столкнулся в своем (по общему признанию ограниченном) опыте.

Ответы [ 20 ]

7 голосов
/ 16 августа 2013

Здесь следует следовать дзен Python «явное лучше, чем неявное». Это действительно ссылка на ваш объект класса. Например, в Java и PHP он называется this.

Если user_type_name - это поле в вашей модели, вы можете получить к нему доступ через self.user_type_name.

5 голосов
/ 26 апреля 2010

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

5 голосов
/ 12 января 2018

Прежде всего, self - это условное имя, вместо него можно поставить что-нибудь другое (будучи связным).

Он относится к самому объекту, поэтому, когда вы его используете, вы заявляете, что .name и .age являются свойствами объектов Student (обратите внимание, не класса Student), которые вы собираетесь создать.

class Student:
    #called each time you create a new Student instance
    def __init__(self,name,age): #special method to initialize
        self.name=name
        self.age=age

    def __str__(self): #special method called for example when you use print
        return "Student %s is %s years old" %(self.name,self.age)

    def call(self, msg): #silly example for custom method
        return ("Hey, %s! "+msg) %self.name

#initializing two instances of the student class
bob=Student("Bob",20)
alice=Student("Alice",19)

#using them
print bob.name
print bob.age
print alice #this one only works if you define the __str__ method
print alice.call("Come here!") #notice you don't put a value for self

#you can modify attributes, like when alice ages
alice.age=20
print alice

Код здесь

4 голосов
/ 12 января 2016

Я удивлен, что никто не воспитал Луа. Lua также использует переменную self, однако она может быть опущена, но все еще используется. C ++ делает то же самое с этим. Я не вижу смысла объявлять «себя» в каждой функции, но вы все равно должны иметь возможность использовать его так же, как вы можете использовать lua и C ++. Для языка, который гордится своей краткостью, странно, что он требует от вас объявить переменную self.

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

Это связано с тем, что при разработке python альтернативы вряд ли будут работать. Python разработан, чтобы позволить методам или функциям быть определенными в контексте, где неявные this (а-ля Java / C ++) или явные @ (а-ля ruby) не будут работать. Давайте рассмотрим пример с явным подходом с соглашениями Python:

def fubar(x):
    self.x = x

class C:
    frob = fubar

Теперь функция fubar не будет работать, поскольку она предполагает, что self является глобальной переменной (и в frob также). Альтернативой может быть выполнение методов с замененной глобальной областью действия (где self - это объект).

Неявный подход будет

def fubar(x)
    myX = x

class C:
    frob = fubar

Это будет означать, что myX будет интерпретироваться как локальная переменная в fubar (и в frob также). Альтернативой здесь было бы выполнение методов с замененной локальной областью действия, которая сохраняется между вызовами, но это исключило бы возможность использования локальных переменных метода.

Однако текущая ситуация хорошо работает:

 def fubar(self, x)
     self.x = x

 class C:
     frob = fubar

здесь при вызове в качестве метода frob получит объект, для которого он вызван, с помощью параметра self, а fubar все еще может быть вызван с объектом в качестве параметра и будет работать так же (это тоже самое что и C.frob думаю).

3 голосов
/ 01 августа 2018

Использование аргумента, условно называемого self, не так сложно понять, так как зачем это нужно? Или о том, почему это явно упоминается? Это, я полагаю, более важный вопрос для большинства пользователей, которые ищут этот вопрос, или, если это не так, у них наверняка возникнет тот же вопрос, что и в дальнейшем изучении Python. Я рекомендую им прочитать эту пару блогов:

1: использование объяснений

Обратите внимание, что это не ключевое слово.

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

2: Почему у нас это так и почему мы не можем исключить его в качестве аргумента, такого как Java, и вместо этого иметь ключевое слово

Еще одна вещь, которую я хотел бы добавить: необязательный аргумент self позволяет мне объявлять статические методы внутри класса, не записывая self.

Примеры кодов:

class MyClass():
    def staticMethod():
        print "This is a static method"

    def objectMethod(self):
        print "This is an object method which needs an instance of a class, and that is what self refers to"

PS : работает только в Python 3.x.

В предыдущих версиях вы должны явно добавить @staticmethod декоратор, в противном случае обязательный аргумент self.

3 голосов
/ 15 ноября 2014

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

class Restaurant(object):  
    bankrupt = False

    def open_branch(self):
        if not self.bankrupt:
           print("branch opened")

#create instance1
>>> x = Restaurant()
>>> x.bankrupt
False

#create instance2
>>> y = Restaurant()
>>> y.bankrupt = True   
>>> y.bankrupt
True

>>> x.bankrupt
False  

self используется / необходим для различения экземпляров.

1 голос
/ 26 января 2014

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

self, как имя, это просто соглашение , называйте его как хотите! но при его использовании, например, для удаления объекта, вы должны использовать то же имя: __del__(var), где var использовалось в __init__(var,[...])

Вам также следует взглянуть на cls, чтобы получить большую картину . Это сообщение может быть полезным.

0 голосов
/ 23 мая 2019

self неизбежно.

Был только вопрос должен self быть явным или неявным. Guido van Rossum решил этот вопрос, сказав, что self должен остаться .

Так, где живут self? 1019 *

Если бы мы просто придерживались функционального программирования, нам бы не понадобилось self. Как только мы входим в Python OOP , мы находим self там.

Вот типичный пример использования class C с методом m1

class C:
    def m1(self, arg):
        print(self, ' inside')
        pass

ci =C()
print(ci, ' outside')
ci.m1(None)
print(hex(id(ci))) # hex memory address

Эта программа выведет:

<__main__.C object at 0x000002B9D79C6CC0>  outside
<__main__.C object at 0x000002B9D79C6CC0>  inside
0x2b9d79c6cc0

Итак, self содержит адрес памяти экземпляра класса. Цель из self состоит в том, чтобы хранить ссылку для методов экземпляра и для нас явный доступ к этой ссылке.


Обратите внимание, что существует три различных типа методов класса:

  • статические методы (читай: функции),
  • методы класса,
  • методы экземпляра (упомянутые).
0 голосов
/ 26 апреля 2010

это явная ссылка на объект экземпляра класса.

...