Используйте Enum в отдельном классе

Я пишу способ создания банковского счета. Это очень просто, я хочу, чтобы на выходе было имя и тип учетной записи пользователя. Однако у меня проблемы с использованием Enum в моем основном классе.

from enum import Enum

class AccountType(Enum):
    SAVINGS = 1
    CHECKING = 2

#bank account classes that uses AccountType
class BankAccount():
    def __init__(self, owner, accountType):
        self.owner = owner
        self.accountType = accountType

    def __str__(self):
        self.d = AccountType(1)
        return "The owner of this account is {} and his account type is: {} ".format(self.owner, self.d)

#test the code
test = BankAccount("Max", 1)
print(test)

Выход

The owner of this account is Max and his account type is: AccountType.SAVINGS

Так что это желаемый результат, но он работает только тогда, когда я жестко запрограммировал тип учетной записи в методе __str__ (AccountType(1)). Чтобы уточнить, я имею в виду эту строку:

BankAccount("Max", 1)

Есть ли способ сделать это так, что если я введу 1 в параметр BankAccount для accountType, он вернет

The owner of this account is Max and his account type is: AccountType.SAVINGS

Почему вы используете self.d вместо self.accountType?

Mad Physicist 27.09.2018 02:39

Не обращайте внимания на то, что вы имели в виду под «если я введу 1 в объект BankAccount, он вернет тип учетной записи?». Пожалуйста, редактировать ваш вопрос и поясните - возможно, на примере того, что вы хотите, чтобы произошло.

martineau 27.09.2018 02:51

@martineau. Спасибо за внимание. Я вернул свою правку, но без выделения.

Mad Physicist 27.09.2018 02:52

Рабочая лошадка: Извините, но ваше редактирование действительно не сильно помогло, потому что вы не сказали, что хотите вернуть эту (строку?), Которая выглядит точно так же, как показано ранее в разделе «Вывод».

martineau 27.09.2018 02:59

@martineau. Согласовано. Мне нравится блочная запись, но, видимо, OP нет. Я в основном после значка "редактировать и отвечать в течение 12 часов".

Mad Physicist 27.09.2018 03:00

Рабочая лошадка: вы можете получить имя, связанное со значением Enum, например: AccountType(1).name -> SAVINGS. Это помогает?

martineau 27.09.2018 03:05

@martineau, спасибо за ответ! Извините, я новичок в python. Где именно я должен ввести эту строку?

Workhorse 27.09.2018 03:14

Рабочая лошадка: Я думаю, проблема в том, что вы говорите, что получаете желаемый результат, но это только потому, что вы жестко запрограммировали что-то в методе __str__(), что, очевидно, не будет работать для других типов учетных записей. Посмотрите ответ, который я только что опубликовал.

martineau 27.09.2018 03:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
148
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете применить то же самое, что и к жестко запрограммированному 1 в __str__, к accountType в __init__:

self.accountType = AccountType(accountType)

Несмотря на то, что теперь вы можете избавиться от self.d и использовать self.accountType, я бы рекомендовал не использовать целочисленное значение при инициализации для начала:

test = BankAccount("Max", AccountType.SAVINGS)

Это намного понятнее, чем использование магического числа. Обновление до __init__ примет как перечисления, так и их значения.

Есть ли способ ввести:

Workhorse 27.09.2018 03:14
Ответ принят как подходящий

Это всего лишь предположение, потому что я все еще не уверен, о чем вы спрашиваете.

from enum import Enum

class AccountType(Enum):
    SAVINGS = 1
    CHECKING = 2

#bank account classes that uses AccountType
class BankAccount:
    def __init__(self, owner, accountType):
        self.owner = owner
        self.accountType = accountType

    def __str__(self):
        return("The owner of this account is {} "
               "and his account type is: {} ".format(
                    self.owner, AccountType(self.accountType).name))

#test the code
test = BankAccount("Max", 1)
print(test)
test2 = BankAccount("Mark", 2)
print(test2)

Выход:

The owner of this account is Max and his account type is: SAVINGS
The owner of this account is Mark and his account type is: CHECKING

Таким образом, вам не нужно ничего жестко кодировать или создавать атрибут self.d, поскольку он больше не нужен.

Это именно то, что я хотел! команда .name для меня нова.

Workhorse 27.09.2018 14:47

Workhorse: Честно говоря, для меня это тоже ново. Каждый членEnum имеет атрибуты name и value, связанные с ним. Единственное явное упоминание об этом в документации, которое я нашел в этой заметке, касается Номенклатура, так что это то, что можно легко упустить из виду.

martineau 27.09.2018 18:22

Рабочая лошадка: Исправление: name и value на самом деле являются свойствами (а не атрибутами) членов. В документации есть немного больше о них.

martineau 27.09.2018 20:11

Другие вопросы по теме