2016-04-06 10 views
1

残高の設定、残高の入金/引き落とし、残高の返却を可能にするBankAccountクラスがあります。pythonで呼び出されたときにbalance()メソッドが機能しない

class BankAccount(): 

    def __init__(self, initialBalance = 0): 
     self.balance = initialBalance 

    def __repr__(self): 
     return("BankAccount({})".format(self.balance)) 

    def deposit(self, amount): 
     self.balance += amount 

    def withdraw(self, amount): 
     self.balance -= amount 

    def balance(self): 
     return(self.balance()) 

しかし、私はバランスメソッド(b.balance())を呼び出すとき、それはfloatオブジェクト呼び出すことはできませんエラーが発生します。しかし、私はそれをb.balanceと呼ぶと適切な量を返します。私は、エラーの意味と、なぜメソッド呼び出しがうまくいかないのか混乱しています。前もって感謝します!

+6

なぜ、balanceという名前のインスタンスメソッドと、同じ名前のバランスを持つインスタンス属性がありますか?あなたはそれをするのに悩むことを求めています。それらの名前を変更することを強くお勧めします。 – idjaw

+1

'' balance''がメソッドかプロパティかを決定します。定義されたメソッドをあなたのctorに渡された値で上書きします。 – Ben

+0

@idjawありがとう!私は名前が矛盾していることを知らなかった...生きて、あなたは学ぶ。 – Frank

答えて

3

同じ名前の属性とメソッドを持つことはできません。あなたは、どちらかの属性に別の名前を付けることができます。

class BankAccount(): 

    def __init__(self, initialBalance = 0): 
     self._balance = initialBalance 

    def __repr__(self): 
     return("BankAccount({})".format(self._balance)) 

    def deposit(self, amount): 
     self._balance += amount 

    def withdraw(self, amount): 
     self._balance -= amount 

    def balance(self): 
     return(self._balance) 

print(BankAccount()) 

または直接属性にアクセス(およびアクセサメソッドを削除):

class BankAccount(): 

    def __init__(self, initialBalance = 0): 
     self.balance = initialBalance 

    def __repr__(self): 
     return("BankAccount({})".format(self.balance)) 

    def __repr__(self): 
     return("BankAccount({})".format(self.balance)) 

    def deposit(self, amount): 
     self.balance += amount 

    def withdraw(self, amount): 
     self.balance -= amount 

print(BankAccount()) 
+0

ああ!私はそれを認識していませんでした...ありがとうございました – Frank

0

それは属性である

def balance(self) 

を削除します。属性を持っている場合、それを取得するメソッドは必要ありません。

+2

それは何も説明していません。 – TigerhawkT3

3

クラスを定義すると、そのメソッドのすべてが定義されています、呼び出されませんでした。これにはdef balance(self):が含まれます。それらの方法は、例えば、 self.methodname。このクラスのインスタンスを作成すると、__init__メソッドが呼び出され、def __init__(self, initialBalance=0):と定義されます。このメソッドは、インスタンス属性self.balanceを割り当て、浮動小数点値を与えます。これを行うと、self.balanceが指し示した古いインスタンス属性(定義したメソッド)は参照されなくなり、Pythonのガベージコレクタによって収集され、消えます。

重要な点は、Pythonには関数名用のバッグが1つもなく、他の名前用のバッグも1つもないということです。浮動小数点数、関数、その他何かを指しているかどうかにかかわらず、すべてのインスタンス属性名のためのバッグを持っています。

また、self.balanceを上書きしていないと、そのメソッドは停止することなく再帰(再帰)を呼び出すため、さらに問題が発生していました。だから、あなたがそれを呼び出すと、それは自分自身を呼び出すでしょう、それは永遠に、それ自身を呼び出してエラーを生成します。

定義済みのdef balance(self):メソッドを完全に削除するだけです。それは有用な何かをしていたようには見えず、単にself.balance属性に直接アクセスすることができます。

+0

素晴らしい答え! +1 – idjaw

0

self.balance()は、BankAccountクラスのbalanceメソッドを呼び出し、b.balanceは、BankAccountオブジェクトのバランス属性です。

返品は方法ではないので返品(何か)ができないため、浮動小数点であるself.balance()というエラーが発生しているためです。しかし、b.balanceを実行すると、完全に有効な構文で、現在の残高であるbalance属性の値が返されます。

提案:アトリビュートバランスとメソッドバランスの異なる名前を使用してください(おそらくcheck_balance)。

関連する問題