Подтвердить что ты не робот

Вложенные классы 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

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

4b9b3361

Ответ 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

Конечно, поскольку вы показываете рабочий код без вложенных классов, он действительно задает вопрос о том, почему вы хотите использовать вложенные классы для этого. Я бы сказал, что не-вложенная версия намного чище.