2012-03-20 11 views
8

Jestem nowym użytkownikiem Pythona, a zmienna składowa klasy działa dziwnie w moim kodzie Pythona. niektóre działają jak normalna zmienna, ale niektóre działają jak zmienna statyczna!zmienna składowa python działa jak zmienna składowa, a niektóre działają jak zmienna statyczna

class Chaos: 
    list_value = [] 
    value = "default" 

    def set_value(self, word): 
     self.list_value.append(word) 
     self.value = word 

    def show(self, num): 
     print(str(num) + "====") 
     print("value : " + self.value) 
     for st in self.list_value: 
      sys.stdout.write(st) 
     print("\n=====\n") 

a = Chaos() 
a.show(0) 
a.set_value("A") 
a.show(1) 
b = Chaos() 
a.show(2) 
b.show(3) 

wynik

0==== 
value : default 

===== 

1==== 
value : A 
A 
===== 

2==== 
value : A 
A 
===== 

3==== 
value : default 
A 
===== 

ale ostatni wynik badania jest różny od tego, co spodziewałem się w poprzednim teście. Nie powinno być "A" w "wartość_ listy" instancji "b". Zostało ono utworzone i nigdy wcześniej nie dodano "A". Dodałem "A" do instancji "a", a nie "b". Ale wynik pokazują, że są również "A" w "b" Co więcej, "wartość listy" i "wartość" w klasie działa inaczej. Wygląda na to, że obie mają tę samą składnię. dlaczego działają inaczej?

+4

możliwy duplikat [Dlaczego atrybut klasy jest pamiętany?] (Http://stackoverflow.com/questions/9713259/why-class-attribute-is-remembered) –

Odpowiedz

17

Są to w rzeczywistości zmienne klasy. Aby utworzyć zmienne instancji, zainicjować je w funkcji __init__:

class Chaos: 
    def __init__(self): 
     self.list_value = [] 
     self.value = "default" 

Powodem value zachowuje się podobnie jak zmienne instancji jest, ponieważ jesteś ustawienie go przy użyciu self.value. Kiedy Python widzi self.X, sprawdza, czy w twoim obiekcie znajduje się własność X, a jeśli nie ma, sprawdza swoją klasę. Ponieważ nigdy nie ustawiłeś self.list_value, uzyskujesz dostęp do zmiennej klasy, która jest wspólna dla wszystkich instancji, więc wszelkie modyfikacje odzwierciedlą się w każdym innym obiekcie.

3

Kluczową różnicą jest to, że dodajesz do list_value i przypisujesz numer value. Nazywa się je "zmiennymi klasowymi". Każda instancja ma własne odniesienie do zmiennej klasy, dlatego lista jest udostępniana. Jednak podczas przypisywania zmienia się odwołanie do tej instancji, aby wskazywało na inną zmienną, co wyjaśnia zachowanie value.

Jeśli szukasz zachowania zmiennej instancji od list_value, zamiast tego zainicjuj ją w konstruktorze (metoda klasy o nazwie __init__).

Powiązane problemy