Сегодня я узнал…

Я тут недавно сделал пост, в котором показал как можно делать dotted dict и подумал что это аналог stdClass в PHP.

https://medium.com/@frontman/fun-python-2-stdclass-like-in-php-c5d5895d9bdb

Я был не совсем прав. Аналогом stdClass из PHP можно считать следующий вариант:

a = type("stdClass", (), {
"foo": 123,
"bar": lambda x: x + 1
})

print(a.bar(a.foo)) # 124
print(type(a)) # <class 'type'>

В Python-е все является объектом, и классы не исключение, а значит, эти классы кто-то создаёт. Собственно все классы создает type, который является базовым классом. У каждого класса есть type, а типом самого type является он сам. Это рекурсивное замыкание, которое реализовано внутри Python с помощью С:

type(type) # <class 'type'>

Кстати, второй аргумент в type — это кортеж, в котором перечисляют классы от которых нужно унаследоваться:

class B:
buz: "abc"
a = type("stdClass", (B,), {})
print(a.buz) # abc

Собственно вот что я сегодня узнал про классы в Python 🙂