Ответ 1
C = MyReallyBigClassNameWhichIHateToType
Если у меня есть класс python, как я могу перечислить это имя класса в другое имя класса и сохранить все его методы, члены класса и члены экземпляра? Возможно ли это без использования наследования?
например. У меня есть класс вроде:
class MyReallyBigClassNameWhichIHateToType:
def __init__(self):
<blah>
[...]
Я создаю сеанс интерактивной консоли, в котором я не хочу, чтобы пальцы моих пользователей падали, когда вы создавали экземпляр класса в интерактивных сеансах, поэтому я хочу, чтобы псевдоним, что действительно длинное имя класса, было чем-то маленьким, как "C", Есть ли простой способ сделать это без наследования?
C = MyReallyBigClassNameWhichIHateToType
Кроме того, если вы импортируете имя из другого модуля...
from modulename import ReallyLongNameWhichIHateToType as FriendlyName
Вы можете просто сделать:
ShortName = MyReallyBigClassNameWhichIHateToType
Класс в Python - это просто объект, как и любой другой, и может иметь более одного имени.
Рефакторируйте имя, нет причины, чтобы оно имело длинное имя.
В противном случае whateverName = VeryLongClassName
должен выполнить трюк.
Подход простого присвоения имен работает, но имеет один недостаток, который может быть важен в некоторых случаях: псевдоним будет таким же, как и имя "базового" класса из-за свойства __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'