Я пишу способ создания банковского счета. Это очень просто, я хочу, чтобы на выходе было имя и тип учетной записи пользователя. Однако у меня проблемы с использованием 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
Не обращайте внимания на то, что вы имели в виду под «если я введу 1 в объект BankAccount
, он вернет тип учетной записи?». Пожалуйста, редактировать ваш вопрос и поясните - возможно, на примере того, что вы хотите, чтобы произошло.
@martineau. Спасибо за внимание. Я вернул свою правку, но без выделения.
Рабочая лошадка: Извините, но ваше редактирование действительно не сильно помогло, потому что вы не сказали, что хотите вернуть эту (строку?), Которая выглядит точно так же, как показано ранее в разделе «Вывод».
@martineau. Согласовано. Мне нравится блочная запись, но, видимо, OP нет. Я в основном после значка "редактировать и отвечать в течение 12 часов".
Рабочая лошадка: вы можете получить имя, связанное со значением Enum, например: AccountType(1).name
-> SAVINGS
. Это помогает?
@martineau, спасибо за ответ! Извините, я новичок в python. Где именно я должен ввести эту строку?
Рабочая лошадка: Я думаю, проблема в том, что вы говорите, что получаете желаемый результат, но это только потому, что вы жестко запрограммировали что-то в методе __str__()
, что, очевидно, не будет работать для других типов учетных записей. Посмотрите ответ, который я только что опубликовал.
Вы можете применить то же самое, что и к жестко запрограммированному 1 в __str__
, к accountType
в __init__
:
self.accountType = AccountType(accountType)
Несмотря на то, что теперь вы можете избавиться от self.d
и использовать self.accountType
, я бы рекомендовал не использовать целочисленное значение при инициализации для начала:
test = BankAccount("Max", AccountType.SAVINGS)
Это намного понятнее, чем использование магического числа. Обновление до __init__
примет как перечисления, так и их значения.
Есть ли способ ввести:
Это всего лишь предположение, потому что я все еще не уверен, о чем вы спрашиваете.
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: Честно говоря, для меня это тоже ново. Каждый членEnum
имеет атрибуты name
и value
, связанные с ним. Единственное явное упоминание об этом в документации, которое я нашел в этой заметке, касается Номенклатура, так что это то, что можно легко упустить из виду.
Рабочая лошадка: Исправление: name
и value
на самом деле являются свойствами (а не атрибутами) членов. В документации есть немного больше о них.
Почему вы используете
self.d
вместоself.accountType
?