LINUX.ORG.RU

ссылка на текущий инстанс класса очевидно. кстати, self это лишь общепринятое имя, насколько я знаю, при желании можно обозвать его как хочешь (не помню, есть это в pep8 или нет)

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)

Это как this, только self

MrClon ★★★★★
()
Ответ на: комментарий от eternal_sorrow

ссылка на текущий инстанс класса

Я эти слова в разных вариациях прочитал в десятке разных источников.

Зачем она нужна?

Deleted
()

obj.method() == cls.method(obj)

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

aquadon ★★★★★
()
Ответ на: комментарий от eternal_sorrow

только что проверил, и правда работает

Так а с чего ему не работать, он у тебя первым параметром в функцию передается, какое имя этого параметра будет значения не имеет.

micronekodesu ★★★
()
Ответ на: комментарий от eternal_sorrow

Т.е. self это передача объектам класса ссылки на сам этот класс, чтобы было понятно, что речь идёт об объектах этого самого класса?

Deleted
()
Ответ на: комментарий от micronekodesu

ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете

неверно. если мурчало не @classmethod или @staticmehtod, то это выбросит

TypeError: мурчало() missing 1 required positional argument: 'self'

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от Deleted

Когда ты вызываешь obj.method(), на самом деле вызывается cls.method(obj). Т.е. ссылка на экземпляр класса передается методу класса всегда (кроме спец. методов). Находясь внутри метода класса ты можешь обратиться к этому объекту через self и вызвать, например, другой метод этого объекта.

Если не понятно в документации - почитай про this в Java.

aquadon ★★★★★
()
Последнее исправление: aquadon (всего исправлений: 1)

Просто «ссылка» на текущий экземпляр класса.

In [2]: class Fractal:
   ...:     def get_self(self):
   ...:         return self
   ...:

In [3]: alexferman = Fractal()

In [4]: alexferman == alexferman.get_self()
Out[4]: True

In [5]: alexferman == Fractal().get_self()
Out[5]: False
Deleted
()

То же, что и this в C++/Java.

Deleted
()

Так, я вроде понял, где у меня провал.

В чём разница между объектом и экземпляром класса?

Deleted
()

Это галимое сишное ООП типа GTK. В С++ объект и его методы всегда знают себя. В Си - нет. В Си есть только функция, которой нужно передать объект над которым производится действие (читай вызов метода), и список аргументов для метода.

C++:

widget->setWindoTitle("C++");

C:
gtk_window_set_title(GTK_WINDOW(window), "C or Python");

В Си также нету ограничений доступа private/protected. Классы в Питоне копируют Си со всеми этими тупостями, но не смотря на это, это всё равно ООП. Привыкай.

former_anonymous ★★★
()
Ответ на: комментарий от former_anonymous

В Си также нету ограничений доступа private/protected.

Есть, но реализуется не на уровне классов, а на уровне модулей.

Deleted
()
Ответ на: комментарий от Deleted

В чём разница между объектом и экземпляром класса?

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

former_anonymous ★★★
()
Ответ на: комментарий от Deleted

Это «описание» класса:

In [2]: class Fractal:
   ...:     def get_self(self):
   ...:         return self

Это «создание» экземпляра:

In [3]: alexferman = Fractal()

In [4]: alexferman
Out[4]: <__main__.Fractal at 0x104f4cc18>

При следующем «создании» — это уже будет другой экземпляр:

In [5]: another_alexferman = Fractal()

In [6]: another_alexferman
Out[6]: <__main__.Fractal at 0x104f7a0b8>

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

Deleted
()
Ответ на: комментарий от Deleted

Так, это понятно, спасибо. «Создание экземпляра» класса это типа исполнение того, что «описано» в классе?

Deleted
()
Ответ на: комментарий от micronekodesu

Всё, я просто криво прочитал в книге.

Deleted
()
Ответ на: комментарий от Deleted

в С++/Java мире класс - это чертёж объекта. Объект/экземпляр класса - вещественный объект, созданный по этому чертежу. В Питоне если не дурить голову - тоже. И вообще: https://www.youtube.com/playlist?list=PL-osiE80TeTt2d9bfVyTiXJA-UTHn6WwU

former_anonymous ★★★
()

Так, читанул этот тред, потом перечитал этот, и теперь понятно, что такое self и зачем он.

Непонятно одно. Когда я в методе класса удаляю у всех переменных префикс self. - всё равно всё работает. Почему?

Deleted
()
Ответ на: комментарий от micronekodesu

‎dark‎: ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете

Наглая ложь.

>>> class Кот:
...   def мурчало(self):
...     pass
... 
>>> Кот.мурчало()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: мурчало() missing 1 required positional argument: 'self'
WitcherGeralt ★★
()
Ответ на: комментарий от Deleted

Если я не буду именовать переменные через self, то если я изменю их в одном экземпляре класса, то они изменятся во всех экземплярах?

Deleted
()
Ответ на: комментарий от Deleted

А как ты вообще к атрибутам обращаешься? Через класс? Проперти надо юзать, тогда работать не будет и глупых вопросов не возникнет.

WitcherGeralt ★★
()
Ответ на: комментарий от Deleted

В чём разница между объектом и экземпляром класса?

Во-первых, не слушай юзера former_anonymous с его

это одно и тоже, просто разными словами

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

Дурит голову тебе как раз он, слабо разбираясь в обсуждаемой теме.

-----------------------------------------------

Теперь к сути. Рассмотрим следующий простейший пример. Создадим пустой класс (без методов, даже без __init__). Создадим экземпляр этого класса.

class A:                                                                        
    pass                                                                        
                                                                                
a = A()  

A здесь объект класса. Мы можем с ним обращаться, как с обычным питоновским объектом. Можешь запустить интерактивный режим и повторить мои примеры

>>> A
<class '__main__.A'>
>>> 
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Мы вывели информацию об объекте класса, а также посмотрели список доступных атрибутов. Если ты будешь добавлять методы в определение объекта класса (вместо pass), то они тоже будут появляться в выводе dir(A). Но и без этого, как видишь, атрибутов хватает. Можно поговорить про них подробнее, но позже.

Теперь, что мы можем делать с этим объектом класса? В первую очередь — создавать экземпляры. Именно это и происходит в строчке a = A(). Экземпляр класса (у нас это a) будет использоваться в качестве self, если мы добавим в определение объекта класса какие-нибудь методы.

Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

Дурит голову тебе как раз он, слабо разбираясь в обсуждаемой теме.

расскажи ему ещё про метаклассы и рефлексию, самое то для новичка, который не может понять что такое self.

former_anonymous ★★★
()
Ответ на: комментарий от former_anonymous

Расскажу, если спросит. Но в данный момент он спросил «в чём разница между объектом и экземпляром класса?».

Каким бы он ни был новичком, есть устоявшаяся терминология, и нельзя говорить, что «это одно и то же, просто разными словами». Это не просто разные слова, это именно разные понятия, которые составляют основу python.

Crocodoom ★★★★★
()
Ответ на: комментарий от Deleted

Далее напишем пример с использованием понятий «объект класса» и «экземпляр класса». Создадим простейшую «фабрику», которая будет принимать объект класса, и возвращать 4 экземпляра этого класса.

def factory(cls):                                                               
    return [cls(), cls(), cls(), cls()]     

Позапускаем в интерактивном интерпретаторе.

>>> for x in factory(int): print(x)
... 
0
0
0
0
>>> for x in factory(float): print(x)
... 
0.0
0.0
0.0
0.0

Как видишь, в factory мы передали два различных объекта класса (int и str) и получили по четыре экземпляра этих классов. Экземпляры получились одинаковые, легко понять почему. Мы можем это изменить, написав класс, который моделирует случайное число.

import random
class random_number:                                                            
    def __init__(self):                                                         
        self.var = random.randint(0, 100)                                       
    def __str__(self):                                                          
        return str(self.var)       

Передадим объект этого класса в нашу фабрику и получим четыре уже различных экземпляра

>>> for x in factory(random_number): print(x)
... 
97
20
4
86
Crocodoom ★★★★★
()
Ответ на: комментарий от anonymous

Именно в детском саду и нужно проходить понятия «объект класса» и «экземпляр класса», и разницу между ними. На минуточку, это всего лишь 82-ая (из 454) страница классической книги «Язык программирования Python» за авторством сам догадываешься кого. Это основы, это база, это азы.

Crocodoom ★★★★★
()
Последнее исправление: Crocodoom (всего исправлений: 1)
Ответ на: комментарий от Crocodoom

нельзя говорить, что «это одно и то же, просто разными словами»

У всех нормальных людей это одно и тоже. Чтобы не путаться что такое «объект класса», то по отношению к классу в виде объекта говорят «метаобъект (класса)». А когда говорят просто «объект класса Х» всегда подразумевается именно экземпляр (инстанс) класса X.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

У всех нормальных людей это одно и тоже

У питонистов это не одно и то же.

Чтобы не путаться что такое «объект класса», то по отношению к классу в виде объекта говорят «метаобъект (класса)»

Понятия метаобъект не существует.

А когда говорят просто «объект класса Х» всегда подразумевается именно экземпляр (инстанс) класса X.

Нет, нет, и ещё раз нет. Открывай «Язык программирования Python» и читай 9-ую главу. Это относится ко всем, у кого будут вопрос к терминологии данной ветки обсуждения.

Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

Открывай «Язык программирования Python» и читай 9-ую главу

Перед тем как тыкать книжкой нужно сначала подучить язык, на котором она написана. Только больной на голову человек может брать терминологию, которую придумал переводчик. В английском есть «class object» и это ни разу не «объект класса» (который object of class), а «классовый объект».

no-such-file ★★★★★
()
Ответ на: комментарий от Crocodoom

Да, что-то такое я сам проделал полчаса назад))

Deleted
()
Ответ на: комментарий от Crocodoom

Кстати, плюсую. Все книги по Питону (которые я видел) начинают почему-то с работы со строками, числами, и с прочих мелочей. По-моему, надо сразу начинать с ООП, а всё остальное затрагивать мимоходом.

Deleted
()
Ответ на: комментарий от no-such-file

Перед тем как тыкать книжкой нужно сначала подучить язык, на котором она написана.

В первую очередь тебе (см. далее)

Только больной на голову человек может брать терминологию, которую придумал переводчик.

Тем не менее, именно эта термилогия и принята у питонистов.

В английском есть «class object» и это ни разу не «объект класса» (который object of class), а «классовый объект».

Термины «class object» и «object of class» полностью эквивалентны синтаксически, поскольку и там и там это притяжательный падеж. Если бы ты хоть немного знал английский, то был бы в курсе.

Crocodoom ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.