LINUX.ORG.RU

Инициализатор класса или функция

 ,


0

3

Здравствуйте! Уже достаточно давно я поправляю людей, которые говорят, что в Python есть ‘функция int’, т.к. int - это, естественно, класс, у которого есть инициализатор. Так что int(‘101’, base=2) - это не вызов функции, а вызов обычного инициализатора класса int

Но недавно я, к своему удивлению, в официальной документации на странице Built-in Functions в табличке увидел все основные типы данных. Т.е. из документации следует, что int(), str(), bool() и т.д. - функции.

Так где же правда?



$ python3
Python 3.10.12 (main, Jul 29 2024, 16:56:48) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> help(int)

Help on class int in module builtins:

class int(object)
 |  int([x]) -> integer
 |  int(x, base=10) -> integer
 |  
 |  Convert a number or string to an integer, or return 0 if no arguments
 |  are given.  If x is a number, return x.__int__().  For floating point
 |  numbers, this truncates towards zero.
 |  
 |  If x is not a number or if base is given, then x must be a string,
 |  bytes, or bytearray instance representing an integer literal in the
 |  given base.  The literal can be preceded by '+' or '-' and be surrounded
 |  by whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.
 |  Base 0 means to interpret the base from the string as an integer literal.
 |  >>> int('0b100', base=0)
 |  4

С python2 дело обстоит точно так же. Читайте старые книги по пифтону, молодой человек. Так вы узнаете, что изначально упомянутые «функции» были функциями, а потом их переделали в классы, которые мимикрировали под функции, благодаря одинаковому синтаксису вызова функции и конструктора класса. А что вы там и где прочитали, мне неведомо.

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

инициализатор - это, конечно, метод класса. но речь идет про встроенные функции (built-in functions), которые в общем namespace, а не в пределах конкретного класса

thm
() автор топика
Ответ на: комментарий от Virtuos86

Так вы узнаете, что изначально упомянутые «функции» были функциями, а потом их переделали в классы, которые мимикрировали под функции, благодаря одинаковому синтаксису вызова функции и конструктора класса

Вот это интересная идея, почитаю про это. Просто мне всегда режет слух, когда говорят «воспользуемся функцией int», а тут в оф документации инициализаторы классов основных типов данных оказались в Built-in functions

А что вы там и где прочитали, мне неведомо.

https://docs.python.org/3/library/functions.html

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

https://docs.python.org/3/library/functions.html

Я бы переводил functions тут как возможности, а не как функции. Или функциями, но как в контексте синтаксиса их вызова.

Ну а вообще:

>>> type(int)
<class 'type'>
>>> type(int.__init__)
<class 'wrapper_descriptor'>
>>> type(any)
<class 'builtin_function_or_method'>
>>> def foo(): return 1
...
>>> type(foo)
<class 'function'>
>>> type(type)
<class 'type'>

Те int(a) это инстанцирование класса, как ты верно написал. Ну и как бы функции это тоже классы, строго говоря. А вызов функций это просто вызов соответствующего метода something. С точки зрения написания интерпретатора так точно легче чем делать и функции и объекты сущностями первого порядка.

Причина - реализация математики поверх процессоров. man int_max, int_min приколы. Потому что в python числа у нас обернуты в объекты:

>>> a = 1
>>> a.__init__
<method-wrapper '__init__' of int object at 0x00007FFC206B09B8>

Касательно примера int('3', base=4) - так в синтаксисе python такой вызов функций тоже есть, так что это просто сахар на который можно не обращать внимания.

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

джавай еще спрашивай про генераторы и итераторы лямбды сорты и т.ж, а потом как классы наследуются, а потом еще про еб-ую сортировку, а по факту надо класть жсоны в редис и в бд где все уже за тебя готово.

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

https://docs.python.org/3/library/functions.html

Там так и написано же, функции и типы:

The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.

Очевидно, int и прочая это типы. В документации написано, что это класс, но если объект находится в builtins, то он написан на Си, потому что модули, встроенные в интерпретатор (хотя тут, наверное, нет никакого отдельного модуля, просто набор функций выделенных в отдельный неймспейс), это нативный код, а значит, это по определению не класс, потому что классы пишутся на pure Python.

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