Как вы псевдоним класса Python, чтобы иметь другое имя без использования наследования? - PullRequest
35 голосов
/ 08 мая 2009

Если у меня есть класс python, как я могу связать это имя класса с другим именем класса и сохранить все его методы, члены класса и члены экземпляра? Возможно ли это без использования наследования?

например. У меня есть класс, как:

class MyReallyBigClassNameWhichIHateToType:
    def __init__(self):
         <blah>
    [...]

Я создаю сеанс интерактивной консоли, в котором я не хочу, чтобы пальцы моих пользователей отваливались при создании экземпляра класса в интерактивных сеансах, поэтому я хочу присвоить псевдониму действительно длинное имя класса чему-то крошечному, например, «C» , Есть ли простой способ сделать это без наследования?

Ответы [ 5 ]

72 голосов
/ 08 мая 2009
C = MyReallyBigClassNameWhichIHateToType
35 голосов
/ 08 мая 2009

Кроме того, если вы импортируете имя из другого модуля ...

from modulename import ReallyLongNameWhichIHateToType as FriendlyName
12 голосов
/ 08 мая 2009

Вы можете просто сделать:

ShortName = MyReallyBigClassNameWhichIHateToType

Класс в Python - это просто объект, подобный любому другому, и может иметь более одного имени.

10 голосов
/ 08 мая 2009

Рефакторинг имени, нет причины, по которой оно должно иметь такое длинное имя.

В противном случае whateverName = VeryLongClassName должен добиться цели.

2 голосов
/ 29 ноября 2018

Подход простого присвоения имен работает, но имеет один недостаток, который может быть важен в некоторых случаях: имя псевдонима будет таким же, как имя «базового» класса из-за свойства __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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...