Python Сами типы являются объектами, как это понять?
Цитата: "В действительности в Python даже сами типы представляют собой объекты" Цитата: "тип объекта является объектом типа type"
Насколько я понимаю: тип - это названия (такие как int, str, list...) объектов которые создает программист, чтобы в целом понимать что это такое и что с этим делать. А объект - это информация которая хранится в памяти (т.е. a = 'abc').
Но моя логика ломается в тот момент, когда я прочитал что тип это объект, как это вообще понимать?
Ответы (3 шт):
Переменная это тоже то, что хранится в памяти
Когда мы работаем с языком, например C, типом переменной мы указываем компилятору, какой объём памяти нужно зарезервировать под эту переменную.
Компилятор выделяет место в памяти, и записывает туда это значение
short age = 30; // компилятор зарезервировал 2 байта в памяти под эту переменную
int balance = 5000; // 2 или 4 байта под эту
char balanceCurrency = '$'; // 1 байт под эту
Здесь о типах и их размерах в памяти языка C https://www.tutorialspoint.com/cprogramming/c_data_types.htm
Дальше по поводу примитивный тип это тоже объект
Приведу пример на JavaScript
Допустим у нас есть переменная:
const name = 'Alegro'
По сути, переменная name является примитивной, то есть переменная name является строкой
Но и так же является объектом, у которого со своими методами
Например мы можем сделать так:
const nameUpper = name.toUpperCase() // ALEGRO
В переменную nameUpper мы записали значение, которое вернул встроенный метод переменной name
Кстати, почитайте здесь
https://ru.stackoverflow.com/questions/8337/Является-ли-переменная-объектом-в-ООП
Тут все зависит от вашей точки зрения. Например, если рассматривать программу как объект ("который храниться в памяти"), то у неё есть тип .py, .c и т. д.. Но, если рассматривать python, как язык программирования, то это тоже объект, так как его исходники можно посмотреть на githab и у него тоже есть тип - интерпретируемый. В программировании вы все время находитесь на каком-то уровне абстракции, или погружаясь вниз, до машинных команд, не дай бог, то подымаясь вверх, до фреймворков.
Это просто означает что типы в python являются, так называемыми, first-class citizens (объекты первого класса). Объекты первого класса - это такие элементы языка, которые можно передавать как параметры в функцию, вернуть в качестве результата выполнения фукнции, или присвоить переменной. Проще говоря, в python можно манипулировать типами точно так же, как и числами, строками или другими объектами.
Возможно, проще будет понять сравнив типы в языке вроде C и в Python. В C типы стираются после компиляции и не существуют во время выполнения программы. В C тип нельзя вернуть из функции в зависмости от входного параметра, нельзя сохранить в переменную и использовать позже, нельзя создать новый тип во время выполнения программы. В Python, с другой стороны, все это возможно:
# Вернуть тип в зависимости от значения параметра
def int_or_float(return_int):
return int if return_int else float
num_type = int_or_float(False)
# И использовать его
value = num_type('123')
# Динамически создать новый тип
def mk_cls(x):
class DynamicClass:
def __init__(self, val):
self.val = val
def get(self):
return self.val + x
return DynamicClass
# Класс который прибавляет 1
Cls1 = mk_cls(1)
val1 = cls1(10)
assert val1.get() == 11
# Класс который прибавляет 2
Cls2 = mk_cls(2)
val2 = cls2(10)
assert val2.get() == 12