Просто вызовите встроенный «тип», используя три параметра, например:
ClassName = type("ClassName", (Base1, Base2,...), classdictionary)
update , как указано в комментарии ниже, это совсем не ответ на этот вопрос,Я буду держать его как удаленный, поскольку есть некоторые подсказки, которые некоторые люди получают здесь, пытаясь динамически создавать классы - это то, что делает строка выше.
Чтобы создать объект класса, тоже есть ссылка, как указано впринятый ответ, нужно просто вызвать класс:
instance = ClassObject()
Механизм для создания экземпляров таков:
Python не использует ключевое слово new
, которое используют некоторые языки - вместо этого это данныеМодель объясняет механизм, используемый для создания мгновенного класса, когда он вызывается с тем же синтаксисом, что и любой другой вызываемый объект:
Вызывается метод его класса '__call__
(в случае класса его классэто «метакласс», который обычно является встроенным type
).Обычным поведением этого вызова является вызов (псевдо) статического метода __new__
для экземпляра класса, за которым следует его __init__
.Метод __new__
отвечает за выделение памяти и тому подобное, и обычно выполняется __new__
из object
, который является корнем иерархии классов.
Таким образом, вызов ClassObject()
вызывает ClassObject.__class__.call()
(которыйобычно это будет type.__call__
) этот __call__
метод получит сам ClassObject в качестве первого параметра - реализация Pure Python будет выглядеть следующим образом: (версия cPython, конечно, сделана на C, и с большим количеством дополнительного кода для угловых случаеви оптимизации)
class type:
...
def __call__(cls, *args, **kw):
constructor = getattr(cls, "__new__")
instance = constructor(cls) if constructor is object.__new__ else constructor(cls, *args, **kw)
instance.__init__(cls, *args, **kw)
return instance
(я не помню, чтобы видел в документах точное обоснование (или механизм) для подавления дополнительных параметров к корню __new__
и передачи его другим классам - но это то, чтопроисходит "в реальной жизни" - если object.__new__
вызывается с какими-либо дополнительными параметрами, это вызывает ошибку типа - однако любая пользовательская реализация __new__
обычно получает дополнительные параметры)