Вложенные классы python
Прежде всего, здесь мой тестовый код, я использую python 3.2.x:
class account:
def __init__(self):
pass
class bank:
def __init__(self):
self.balance = 100000
def balance(self):
self.balance
def whitdraw(self, amount):
self.balance -= amount
def deposit(self, amount):
self.balance += amount
когда я это сделаю:
a = account()
a.bank.balance
Я ожидал вернуть значение баланса, вместо этого получаю функцию "баланс", почему это так? Он возвращает значение баланса, когда я делаю:
class bank:
def __init__(self):
self.balance = 100000
def balance(self):
self.balance
def whitdraw(self, amount):
self.balance -= amount
def deposit(self, amount):
self.balance += amount
a = bank()
a.balance
Итак, я хочу знать, почему это так, и было бы здорово, если бы кто-то мог придумать способ дать мне значение баланса во вложенной версии.
Ответы
Ответ 1
Моя версия вашего кода с комментариями:
#
# 1. CamelCasing for classes
#
class Account:
def __init__(self):
# 2. to refer to the inner class, you must use self.Bank
# 3. no need to use an inner class here
self.bank = self.Bank()
class Bank:
def __init__(self):
self.balance = 100000
# 4. in your original code, you had a method with the same name as
# the attribute you set in the constructor. That meant that the
# method was replaced with a value every time the constructor was
# called. No need for a method to do a simple attribute lookup. This
# is Python, not Java.
def withdraw(self, amount):
self.balance -= amount
def deposit(self, amount):
self.balance += amount
a = Account()
print(a.bank.balance)
Ответ 2
Существует несколько проблем:
- Вы используете имя
balance
для члена данных и для функции.
- Вам не хватает инструкции
return
в balance()
.
-
balance()
работает с экземпляром bank
. В a.bank.balance
нет экземпляра: здесь a.bank
относится к самому внутреннему классу.
Ответ 3
a.bank
- класс (не экземпляр), так как вы никогда не создавали экземпляр банка на a
. Поэтому, если a.bank
является классом, a.bank.balance
- это метод, связанный с этим классом.
Однако это работает:
class account:
def __init__(self):
self.bank = account.bank()
class bank:
def __init__(self):
self.balance = 100000
def whitdraw(self, amount):
self.balance -= amount
def deposit(self, amount):
self.balance += amount
a = account()
print a.bank.balance
Конечно, поскольку вы показываете рабочий код без вложенных классов, он действительно задает вопрос о том, почему вы хотите использовать вложенные классы для этого. Я бы сказал, что не-вложенная версия намного чище.