2012-03-20 30 views
8

Tôi là newbie python và biến thành viên của lớp hoạt động lạ trong mã python của tôi. một số công trình như biến bình thường, nhưng một số hoạt động như biến tĩnh!biến thành viên python của cá thể hoạt động như biến thành viên và một số hoạt động như biến tĩnh

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) 

kết quả

0==== 
value : default 

===== 

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

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

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

nhưng kết quả cuối cùng của thử nghiệm là khác với những gì tôi mong đợi trong thử nghiệm cuối cùng. Không được có "A" trong 'list_value' của cá thể 'b'. Nó vừa được tạo và chưa bao giờ được thêm 'A' trước đây. Tôi đã thêm 'A' vào trường hợp 'a', không phải 'b'. Nhưng kết quả cho thấy rằng cũng có 'A' trong 'b' Hơn nữa, 'list_value' và 'value' trong lớp hoạt động khác nhau. Dường như cả hai đều có cùng cú pháp. tại sao chúng hoạt động khác nhau?

+4

bản sao có thể có của [Tại sao thuộc tính lớp được ghi nhớ?] (Http://stackoverflow.com/questions/9713259/why-class-attribute-is-remembered) –

Trả lời

17

Trên thực tế, các biến lớp học. Để tạo ra các biến Ví dụ, khởi tạo chúng trong __init__ chức năng:

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

Lý do value là hành xử như biến dụ là bởi vì bạn đang cài đặt nó sử dụng self.value. Khi Python nhìn thấy self.X, có vẻ như có một thuộc tính X trong đối tượng của bạn và nếu không có thì nó sẽ nhìn vào lớp của nó. Vì bạn không bao giờ đặt self.list_value, nó truy cập vào biến lớp, được chia sẻ giữa tất cả các trường hợp, do đó mọi sửa đổi sẽ phản ánh trong mọi đối tượng khác.

3

Điểm khác biệt chính là bạn đang thêm list_value và bạn đang chỉ định cho value. Chúng được gọi là "biến lớp". Mỗi cá thể có tham chiếu riêng của nó với biến lớp, đó là lý do tại sao danh sách được chia sẻ. Tuy nhiên, khi bạn chỉ định, bạn đang thay đổi tham chiếu của cá thể đó để trỏ đến một biến khác, điều này giải thích hành vi của value.

Nếu bạn đang tìm kiếm hành vi biến mẫu từ list_value, hãy khởi tạo nó trong hàm tạo (một phương thức lớp được gọi là __init__).

Các vấn đề liên quan