LINUX.ORG.RU

Python, фабричные функции


0

0
На сколько я понимаю int() это фабричная функция, которая вызывает конструктор у типа int и возвращает обьект этого типа. Но коли объявление ф-ии или класса в python есть просто присваивание обьекта переменной, то значит сам тип int должен называться как то по другому. Я правильно понимаю?
>>> isinstance(int, type)
True

int - это не функция, а класс, то есть экземпляр класса type.

>объявление ф-ии или класса в python есть просто присваивание обьекта переменной

Чушь какая-то.
anonymous4
()
Ответ на: комментарий от anonymous4
Ну а кто вызывает то ф-ию __init__?

>объявление ф-ии или класса в python есть просто присваивание обьекта переменной

> то есть экземпляр класса type

Разве не одго и тоже?

placement_new ★★
() автор топика
Ответ на: комментарий от placement_new
>кто вызывает то ф-ию __init__?

Конструктор класса вызывается при создании экземпляров класса. Ты только сегодня начал постигать ООП что ли?

>>объявление ф-ии или класса в python есть просто присваивание обьекта переменной

>> то есть экземпляр класса type

>Разве не одго и тоже?

Нет. Присваивание - это одно. Объявление - другое.

anonymous4
()
Ответ на: комментарий от tailgunner
>> Присваивание - это одно. Объявление - другое.

>В Питоне - почти одно и то же.

Я бы не сказал, что одно и то же, даже "почти". Собственно класс или функция создается при объявлении (как правило). Присваивание созданного класса/функции новой переменной в сущности равносильно увеличению REFCOUNT на объект. Понятное дело, что создавать классы и функции можно не декларативно, а императивно, но тем не менее присваивание тут будет вторично.

anonymous4
()
Ответ на: комментарий от tailgunner
У меня к сожалению русское издание. Но с учетом вышесказанного, я так понял что в книжке просто подразумевается, что все встроенные типы могут использоваться как фабричные функции.
placement_new ★★
() автор топика
Ответ на: комментарий от placement_new
> У меня к сожалению русское издание.

Это окей, я немного гоффорить по-рюски.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous4
> Собственно класс или функция создается при объявлении (как правило). Присваивание созданного класса/функции новой переменной в сущности равносильно увеличению REFCOUNT на объект.

Класс создается, когда до его тела доходит исполнение, после чего результат исполнения присваивается переменной,которая имеет имя класса. REFCOUNT - это деталь реализации.

> присваивание тут будет вторично.

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

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner
>Тем не менее, без него никак. И ту же переменную,которой присвоено значение класса, можно потом переопределить.

И то что конструктор имеет имя отличное от класса следствие этого же?

placement_new ★★
() автор топика
Ответ на: комментарий от tailgunner
>Класс создается, когда до его тела доходит исполнение, после чего результат исполнения присваивается переменной,которая имеет имя класса. REFCOUNT - это деталь реализации.

Все так, мои слова этому не противоречат.

>> присваивание тут будет вторично.

>Тем не менее, без него никак

Как же никак?

>>> blah = []
>>> blah.append(type('newtype', (object, ), {}))
>>> blah[0]
<class '__main__.newtype'>

Ты знаешь: это императивный способ создания классов. Присваивания созданного класса конкретной переменной тут нет. Живет она только потому, что на нее есть одна ссылка.
anonymous4
()
Ответ на: комментарий от anonymous4
>Живет он (класс) только потому, что на него есть одна ссылка.

fixed

anonymous4
()
Ответ на: комментарий от tailgunner
>Значение класса присвоено blah[0].

А если бы blah был не списком, а, скажем, множеством? Это, конечно, вопрос терминологии, но я бы не назвал это присваиванием.

anonymous4
()
Ответ на: комментарий от placement_new
Да, но тогда нельзя было бы сказать, что присвоено по какому-то конкретному индексу.
anonymous4
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.