Fun Python #3: stdClass like in PHP

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

Fullstack CTO
1 min readJan 12, 2020

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

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

Я был не совсем прав. Аналогом 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 ?

--

--

Fullstack CTO
Fullstack CTO

Written by Fullstack CTO

CTO and co-founder at NEWHR & Geekjob

No responses yet