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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.