0

クラス名にエイリアスを割り当て、クラス本体内で何らかの方法でエイリアスを定義できるようにしたいと考えています。したがって、たとえば、これを行うのではなく:

class C(object):
    pass
C1 = C

私はこれを行うことができるようにしたいと思います:

class C(object):
    __aliases__ = ['C1']

またはそのようなもの。

私の目的は、クラス定義に含まれるエイリアスに関する情報を作成して、適切な環境でオートコンプリートが機能し、あらゆる種類のイントロスペクションでクラスのエイリアスが明らかになるようにすることです (たとえば、これらのエイリアスをドキュメントに含めることができます)。 .)

含まれているフレームなどにジャンプしてゲームをプレイできると思いますが、可能であれば、醜いトリックは避けたいと思います。

問題は、これが可能かどうかです。

4

4 に答える 4

2

クラス デコレーターを使用して同様のことを行う別の方法を次に示しますが、エイリアスはクラス本体内で指定されていません。@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')
于 2014-02-19T00:01:51.230 に答える