クラス デコレーターを使用して同様のことを行う別の方法を次に示しますが、エイリアスはクラス本体内で指定されていません。@BrenBarnの回答と非常に似ていますが、エイリアスがデコレータ引数であることを除いて、これはいくつかのタイプの使用法ではより望ましいと思います(そのようにそれらをより目立たせるので、より明示的に見えます)。
import sys
def aliases(*pseudonyms):
def aliaser(cls):
namespace = sys._getframe(1).f_globals # Caller's globals.
namespace.update({alias: cls for alias in pseudonyms})
cls.aliases = pseudonyms
return cls
return aliaser
if __name__ == '__main__':
@aliases('SN', 'FUBAR')
class LongName(object):
pass
print(SN) # <class '__main__.LongName'>
print(FUBAR) # <class '__main__.LongName'>
print(LongName.aliases) # ('SN', 'FUBar')
アップデート
PEP 487はPython バージョン 3.6 で実装され、新しい__init_subclass__()
フックによる継承によるクラスのカスタマイズが可能になりました。以下のコードは、それを使用して同じことを行う方法を示しています。
class AKA:
""" An 'Also Known As' baseclass that allows subclasses to give themselves
aliases.
"""
def __init_subclass__(cls, /, aliases=(), **kwargs):
super().__init_subclass__(**kwargs)
cls.aliases = aliases
globals().update({alias: cls for alias in aliases})
if __name__ == '__main__':
class LongName(AKA, aliases=('SN', 'FUBAR')):
pass
print(SN) # <class '__main__.LongName'>
print(FUBAR) # <class '__main__.LongName'>
print(LongName.aliases) # ('SN', 'FUBar')