Можно ли выполнять побитовые операции над строковыми флагами в определении класса? - PullRequest
0 голосов
/ 01 ноября 2019

Я создал собственный класс, который расширяет enum.Flag:

from enum import Flag


class StrFlag(Flag):
    def __new__(cls, verbose):
        value = len(cls.__members__)
        obj = object.__new__(cls)
        obj._value_ = 2 ** value
        obj.verbose = verbose
        return obj


class Year(StrFlag):
    FIRST = 'First'
    SECOND = 'Second'
    THIRD = 'Third'
    FOURTH = 'Fourth'
    GRADUATE = 'Graduate'
    FACULTY = 'Faculty'
    OTHER = 'Some string with a space'

Теперь я хочу добавить UNDERGRADUATE и STUDENT в класс. Я знаю, что работает следующий код:

Year.UNDERGRADUATE = Year.FIRST | Year.SECOND | Year.THIRD | Year.FOURTH
Year.STUDENT = Year.UNDERGRADUATE | Year.GRADUATE

, но я хочу поместить

UNDERGRADUATE = FIRST | SECOND | THIRD | FOURTH
STUDENT = UNDERGRADUATE | GRADUATE

в определение класса. Тем не менее, Python не позволит мне сделать это, потому что все они строки. Можно ли сделать код чище?

1 Ответ

0 голосов
/ 07 ноября 2019

В python вы можете добавлять новые атрибуты класса вне определения класса. Следующее работает просто отлично:

class Year(StrFlag):
    FIRST = 'First'
    SECOND = 'Second'
    THIRD = 'Third'
    FOURTH = 'Fourth'
    GRADUATE = 'Graduate'
    FACULTY = 'Faculty'
    OTHER = 'Some string with a space'
Year.UNDERGRADUATE = Year.FIRST | Year.SECOND | Year.THIRD | Year.FOURTH
Year.STUDENT = Year.UNDERGRADUATE | Year.GRADUATE
...