如何在不使用继承的情况下将python类别名为另一个名称?

Ros*_*ers 38 python

如果我有一个python类,我怎么能将该class-name别名为另一个类名并保留它的所有方法,类成员和实例成员?这可能不使用继承吗?

例如我有一个类:

class MyReallyBigClassNameWhichIHateToType:
    def __init__(self):
         <blah>
    [...]
Run Code Online (Sandbox Code Playgroud)

我正在创建一个交互式控制台会话,在交互式会话中实例化类时,我不希望用户的手指脱落,所以我想将真正长的类名称别名为'C'.没有继承,有没有一种简单的方法可以做到这一点?

Sil*_*ost 78

C = MyReallyBigClassNameWhichIHateToType
Run Code Online (Sandbox Code Playgroud)

  • 运作良好,但从长远来看会导致混乱.如果你不想输入它,为什么不只是一次又一次地修改名称? (5认同)
  • 我夸大其词了。原始名称的长度为 7 个字符,但我确实希望交互式名称长度为 1 个字符。 (3认同)

Jam*_*ton 39

此外,如果您从其他模块导入名称...

from modulename import ReallyLongNameWhichIHateToType as FriendlyName
Run Code Online (Sandbox Code Playgroud)

  • 我认为,比任务更清洁. (4认同)
  • 但是你可以在自己的“modulename”中执行此操作吗? (3认同)

dF.*_*dF. 13

你可以简单地做:

ShortName = MyReallyBigClassNameWhichIHateToType
Run Code Online (Sandbox Code Playgroud)

Python中的类只是一个与其他类似的对象,并且可以有多个名称.


Yuv*_*dam 10

重构名称,没有理由它应该有一个很长的名称.

否则whateverName = VeryLongClassName应该做的伎俩.

  • 第一个答案,没有赞成票,与接受的答案相同,有 24 票赞成……必须+1 只是 b/c (3认同)

Hel*_*man 7

简单的名称分配方法可行,但有一个缺点,在某些情况下可能很重要:由于属性的原因,别名将与“基”类的名称相同__name__。

class C(object):
    pass

D = C

print(C.__name__)  # 'C'
print(D.__name__)  # 'C' again
Run Code Online (Sandbox Code Playgroud)

例如,如果您创建自定义异常,然后创建另一个分配第一个异常的异常,则无论您引发其中的哪一个,您每次都会获得此“父”异常的名称,这可能会让用户感到困惑:

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')
Run Code Online (Sandbox Code Playgroud)

输出:

Traceback (most recent call last):
  File "<input>", line 12, in <module>
CustomBaseException: Invalid operation 'readd'
Run Code Online (Sandbox Code Playgroud)

因此,解决方案是实际子类化该类:

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')
Run Code Online (Sandbox Code Playgroud)

输出:

Traceback (most recent call last):
  File "<input>", line 14, in <module>
OperationException: Invalid operation 'delite'
Run Code Online (Sandbox Code Playgroud)