Мне назвали класс BankAccount
как базовый класс. Я также имею CheckingAccount
и SavingsAccount
классы, которые наследовались BankAccount
.
BankAccount не является абстрактным классом, но я не создаю объект из него, только наследующие классы.
Затем я выполняю запрос как это:
account = BankAccount.objects.get(id=10)
Как я знаю, ли учетная запись CheckingAccount
или SavingsAccount
?
Путем я делаю это теперь таким образом:
checking_account = CheckingAccount.objects.get(id=account.id)
Если это существует, это - a CheckingAccount
, иначе это - a SavingsAccount
.
Попробуйте использовать атрибуты checkingaccount
и savingsaccount
. Тот, который есть, не взорвется.
Вы можете использовать isinstance (account, SavingsAccount)
, но обычно предпочитают его избегать и использовать вывод типа утки , глядя на атрибуты объекта, и посмотрите, не крякает ли он как подкласс.
Чтобы узнать, есть ли у объекта атрибут , используйте метко названную hasattr
встроенную функцию или используйте getattr
и проверьте, не возникло ли исключение AttributeError.
Добавьте метод GetAccountType() к вашим счетам Checking и Savings, когда вы получите объект обратно от BankAccount.objects.get(), то вызовите его, если все, что происходит от BankAccount, имеет этот метод, то все будет в порядке.
Немного неловко, но это сработает:
>>> class BankAccount(object): pass
...
>>> class SavingsAccount(BankAccount): pass
...
>>> class CheckingAccount(BankAccount): pass
...
>>> x = SavingsAccount()
>>> type(x) == type(SavingsAccount())
True
>>> type(x) == type(CheckingAccount())
False