Имея объект x
, который является экземпляром некоторого класса, как создать новый экземпляр того же класса, что и объект x
, без импорта этого всех возможных классов в том же пространстве имен в котором мы хотим создать новый объект того же типа и использовать isinstance
для определения правильного типа.
Например, если x
является десятичным числом:
>>> from decimal import Decimal
>>> x = Decimal('3')
>>> x
Decimal('3')
как создать новый экземпляр Decimal
. Я думаю, что очевидным решением будет одно из следующих действий:
>>> type(x)('22')
Decimal('22')
>>> x.__class__('22')
Decimal('22')
Так как __class__
не будет работать на int
например:
>>> 1.__class__
File "<stdin>", line 1
1.__class__
Является ли хорошей практикой использование type
для достижения этого, или есть какие-то другие способы или дополнительные предостережения при использовании этого подхода для создания новых объектов?
Примечание. Был удален ответ, который давал правильный способ получить __class__
из int
.
>>> (1).__class__
<type 'int'>
Случай использования
Вопрос в основном теоретический, но прямо сейчас я использую этот подход с Qt для создания новых экземпляров QEvent
. Например, поскольку объекты QEvent
используются обработчиком событий приложения для публикации события в QStateMachine
вам нужно создать новый экземпляр события, иначе вы получите ошибку времени выполнения, поскольку базовый объект C++ будет удален.
И поскольку я использую пользовательские подклассы QEvent
, которые используют один и тот же базовый класс, объекты принимают одинаковый предопределенный набор аргументов.