17

まず、これが私のテストコードです。Python3.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

だから私はこれがなぜであるか知りたいです、そして誰かが私にネストされたバージョンでバランスの価値を与える方法を思い付くことができればそれは素晴らしいでしょう。

4

3 に答える 3

31

コメント付きの私のバージョンのコード:

#
# 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)
于 2013-01-30T15:06:48.340 に答える
9

いくつかの問題があります:

  1. balanceデータメンバーと関数の両方に名前を使用しています。
  2. returnにステートメントがありませんbalance()
  3. balance()のインスタンスで動作しますbanka.bank.balance:hereにはインスタンスはありません。これはa.bank、内部クラス自体を指します。
于 2013-01-30T14:39:01.950 に答える
1

a.bankに銀行のインスタンスを作成したことがないため、はクラス(インスタンスではありません)です。したがって、がクラスの場合、はそのクラスにバインドされたメソッドです。aa.banka.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

もちろん、ネストされたクラスなしで動作するコードを示すと、これにネストされたクラスを使用する理由について疑問が生じます。ネストされていないバージョンの方がはるかにクリーンであると私は主張します。

于 2013-01-30T14:40:44.957 に答える