Подход простого присвоения имен работает, но имеет один недостаток, который может быть важен в некоторых случаях: имя псевдонима будет таким же, как имя «базового» класса из-за свойства __name__
.
class C(object):
pass
D = C
print(C.__name__) # 'C'
print(D.__name__) # 'C' again
Например, если вы создаете пользовательское исключение, а затем другое, которое назначает первое, вы будете получать имя этого «родительского» исключения каждый раз, независимо от того, какое из них вы вызываете, и это, вероятно, должно смутить пользователя:
class CustomBaseException(Exception):
def __init__(self, operation):
super(CustomBaseException, self).__init__()
self.operation = operation
def __str__(self):
return f"Invalid operation '{self.operation}'"
OperationException = CustomBaseException
raise OperationException('readd')
выход:
Traceback (most recent call last):
File "<input>", line 12, in <module>
CustomBaseException: Invalid operation 'readd'
Таким образом, решение было бы на самом деле подкласс класса:
class CustomBaseException(Exception):
def __init__(self, operation):
super(CustomBaseException, self).__init__()
self.operation = operation
def __str__(self):
return f"Invalid operation '{self.operation}'"
class OperationException(CustomBaseException):
pass
raise OperationException('delite')
выход:
Traceback (most recent call last):
File "<input>", line 14, in <module>
OperationException: Invalid operation 'delite'