2016-11-15 2 views
0

클래스 변수와 것의 차이를 배우려고합니다. 클래스 변수는 대개 정적이며 변경 될 수 있음을 이해합니다.파이썬 클래스 대 인스턴스 변수 | 정수 /리스트

가변 계정을 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'라는 새로운 변수를 바인딩하고 있습니다. 'int'가 변경 가능하지 않기 때문에'Sam.Balance + = 1000'을 사용해도 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 클래스와 Variable 클래스의 차이점을 많이 읽으려고 노력해 왔습니다. @wwii – Davidhall

1

는, 그것이 클래스 변수 전에 경우에도, (하지 다른 인스턴스에 의해 공유) 인스턴스 변수가된다. 이것은 Sam.Balance = 1000의 경우에 일어난 일입니다. 그러나 Sam.Accounts.append("Sam's Personal Checking")은 완전히 다른 상황입니다. 아무 것도 지정하지 않았고 계정 목록은 이전과 완전히 동일한 개체이며 여전히 클래스 변수입니다. 목록을 검색하는 방법에 관계없이 표시되는 목록의 내용을 변경하기 만하면됩니다.

0

정수는 파이썬에서 변경할 수 없으므로 Sam.Balance = 1000 일 때 인스턴스 변수 Balance을 인스턴스 Sam에 추가하고 클래스 변수는 변경하지 않습니다.

+0

클래스는 BankAccount : \t \t 시도 : \t \t \t 인쇄 (self.Balance) \t \t 제외 : \t \t \t 인쇄 ("나는 바보가 아직 자신을 발견 = 0 ​​ \t 데프 PrintSelf (자기) \t 밸런스 ") \t \t 인쇄 (밸런스) \t 샘 = BankAccount가() Sam.Balance = 1000 가Sam.PrintSelf() – Davidhall

+0

돌아 오는 것이 자동으로 수행되도록 내 iPad에 있습니다. 왜 위의 코드에서 클래스 변수를 변경하지 않으면 Balance == 1000입니까? 도와 주셔서 대단히 감사합니다 !! @whbb – Davidhall

관련 문제