Просто зателефонуйте введеному типу, використовуючи три параметри, наприклад:
ClassName = type("ClassName", (Base1, Base2,...), classdictionary)
оновлення,
як зазначено в коментарі нижче, це зовсім не відповідь на це питання. Я залишатиму це не видаленим, оскільки є натяки, які деякі люди отримують тут, намагаючись динамічно створювати класи - саме це робить наведений вище рядок.
Для створення об'єкта класу також є посилання, як зазначено у прийнятій відповіді, потрібно просто викликати клас:
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__
воно викликається з будь-якими додатковими параметрами, викликає помилку типу - однак, будь-яка спеціальна реалізація a __new__
отримає додаткові параметри зазвичай)
instance = Class()
...