Как получить доступ к значению Enum напрямую как атрибут класса?

Вы хотите нежелательное совпадение, .*?

while( $string =~ /ABC(.*?)XYZ/gm ) {
  $match = $1;
}
0
задан martineau 1 March 2019 в 19:41
поделиться

1 ответ

Не используйте класс enum, если вы хотите отобразить атрибуты в строки. Весь смысл пункта модуля enum состоит в создании набора одноэлементных объектов, которые представляют перечисление, а не строки. Из документации модуля:

Перечисление - это набор символических имен (членов), связанных с уникальными постоянными значениями . В пределах перечисления члены могут сравниваться по тождеству , и само перечисление может быть повторено.)

Мое выделение жирным шрифтом. Строки не являются уникальными, постоянными значениями (я могу создать больше "Fido" строк по желанию) и не предназначены для сравнения по тождеству (хотя иногда , для подмножества строк, вы можете ). [ 1135]

Просто определите свой собственный класс с атрибутами, которые являются строками, напрямую:

class Pets:
    DOG = "Fido"
    CAT = "Kitty"

Ваша бесконечная ошибка рекурсии вызвана недопониманием с вашей стороны относительно того, для чего этот метод используется. Подобно всем специальным методам , object.attr ищет __getattr__ для типа объекта , что означает здесь, что ваш метод применяется к экземплярам вашего Enum подкласса. атрибуты DOG и CAT здесь, а не самому классу, и мешают метаклассу EnumMeta, пытающемуся проверить attibute _value_, который обрабатывается вашим методом __getattr__ с использованием self недавно отчеканенный экземпляр Pets.DOG и item установлены в '_value_', который затем вызывает getattr(Pets.DOG, '_value_'), который вызывает __getattr__ и т. д.

Для вашего подхода к работе вам нужно будет создать подкласс EnumMeta и реализовать __getattribute__ для этого подкласса (__getattr__ только когда-либо вызывается для отсутствующих атрибутов ) , Тем не менее, учтите, что __getattribute__ используется для доступа ко всем атрибутам , поэтому вам нужно сначала позаботиться о проверке экземпляров текущего класса:

class EnumDirectValueMeta(EnumMeta):
    def __getattribute__(cls, name):
        value = super().__getattribute__(name)
        if isinstance(value, cls):
            value = value.value
        return value

class Pets(Enum, metaclass=EnumDirectValueMeta):
    DOG = "Fido"
    CAT = "Kitty"

в какой момент Pets.DOG производит 'Fido'.

0
ответ дан Martijn Pieters 1 March 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: