2016-11-15 9 views
0

私はクラス変数とものの違いを知ろうとしています。私は、クラス変数は通常静的であり、変更可能であることを理解しています。Pythonクラスvs.インスタンス変数|整数/リスト

私は、可変アカウントがサムのインスタンスによって変更された後で、それがDavidのために変更された理由を知りたいと思います。

ただし、Samの残高を更新すると、Davidの値は変更されません。ありがとうございました。

class BankAccount: 
    Balance = 0 
    Accounts = [] 

Sam = BankAccount() 
David = BankAccount() 

print("Sam's Balance", Sam.Balance) 
print("David's Balance", David.Balance) 
print("") 
print("Sam's Accounts", Sam.Accounts) 
print("David's Accounts", David.Accounts) 


Sam.Balance = 1000 
Sam.Accounts.append("Sam's Personal Checking") 

print("Sam's Balance", Sam.Balance) 
print("David's Balance", David.Balance) 
print("") 
print("Sam's Accounts", Sam.Accounts) 
print("David's Accounts", David.Accounts) 
+2

既存のリストに 'BankAccount.Balance'と' append() 'を隠す新しい変数' Sam.Balance'をバインドしています。 'Sam.Balance + = 1000'を指定しても' int'が変更できないので 'BankAccount.Balance'を隠すことになります。 – AChampion

+0

'Sam.Balance = 1000'では、新しいインスタンス変数を作成しています。 –

+0

クラス内にプリント機能を追加して、グローバル変数バランスとself.Balanceを印刷したのは同じですか?私はその部分について少し混乱しています。 – Davidhall

答えて

0

答えを示すために、id()またはisオペレータを使用して、オブジェクトが同じものかどうかを確認できます。

>>> class BankAccount: 
    Balance = 0 
    Accounts = [] 


>>> a = BankAccount() 
>>> b = BankAccount() 
>>> id(BankAccount.Balance), id(a.Balance), id(b.Balance) 
(507102960, 507102960, 507102960) 
>>> BankAccount.Balance is a.Balance is b.Balance 
True 
>>> BankAccount.Accounts is a.Accounts is b.Accounts 
True 
>>> b.Balance = 2 
>>> id(BankAccount.Balance), id(a.Balance), id(b.Balance) 
(507102960, 507102960, 507103024) 
>>> BankAccount.Balance is a.Balance is b.Balance 
False 
>>> a.Accounts.append(2) 
>>> BankAccount.Accounts is a.Accounts is b.Accounts 
True 
>>> 

Naming and Bindingです。 そして、Classes section of the Tutorialは洞察を提供するかもしれません。

+0

これはすばらしい例です。ありがとうございました。私の頭の中を包み込むのはかなり難しいです。私はknitとclass Variableの違いについてたくさん読んでいます。 @wwii – Davidhall

1

インスタンスに属性を割り当てるときはいつでも、それはそれは前にクラス変数であっても、(他のインスタンスで共有されていない)インスタンス変数になります。これは、Sam.Balance = 1000の場合に起こったことです。しかし、Sam.Accounts.append("Sam's Personal Checking")はまったく別の状況です。何も指定しなかった場合、Accountsリストはまったく同じオブジェクトで、それでもクラス変数です。リストの内容を変更するだけで、リストの取得方法に関係なく表示されます。

0

整数はPythonでは変更できませんので、Sam.Balance = 1000の場合は、インスタンス変数BalanceがインスタンスSamに追加されますが、クラス変数は変更されません。

+0

クラスのBankAccount: \tバランス= 0 \tデフPrintSelf(自己): \t \t試してみてください。 \t \t \tプリント(self.Balance) \t \t除い:私はNITはまだ自分自身を発見した \t \t \t印刷( " 「) \t \tプリント(バランス) \t サム=銀行口座の() Sam.Balance = 1000 Sam.PrintSelf() – Davidhall

+0

私は自分のiPadにいるので、自動的に返信ができます。なぜ、このコードでは、クラス変数を変更しないと、バランス== 1000になりますか?助けてくれてありがとう! @whbb – Davidhall

関連する問題