a=Demo
не создает никаких объектов, он просто присваивает объект класса Demo
переменной a
.
Вы фактически показываете это сами:
>>>type(a)
<class 'type'>
>>>type(b)
<class '__main__.Demo'>
В Python классы также являются объектами типа type
.
Сравните, что происходит при использовании a
, заменив a
на Demo
.
Обратите внимание, что классыПервоклассные объекты, вы можете обращаться с ними как с любым другим объектом, например с list
или int
.type
на самом деле просто конструктор, как list
и int
:
>>> list()
[]
>>> int()
0
>>>
>>> MyClass = type('MyClass', (), {})
>>> MyClass
<class '__main__.MyClass'>
>>> MyClass()
<__main__.MyClass object at 0x10406fe80>
>>>
Конструктор типа принимает три аргумента имя класса в виде строки (обратите внимание, вы не иметь , чтобы присвоить ему то же имя переменной), кортеж баз, вот он пустой, поэтому он косвенно object
, как если бы вы сделали class A: pass
, и пространство имен , таксопоставление имен атрибутов с атрибутами.Методы - это просто функциональные объекты, которые принадлежат пространству имен класса
Init signature: type(self, /, *args, **kwargs)
Docstring:
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
Type: type
Вот немного менее тривиальный пример класса, созданного с помощью конструктора type
, который также имеет методы:
>>> Foo = type('Foo', (), {'__init__': lambda self, x: setattr(self, 'x', x), 'bar': lambda self: self.x})
>>> f = Foo(42)
>>> f.bar()
42
Подробнее в документах