2010-01-23 32 views
8

Kết quả đầu ra có vẻ hơi giống một chút với mã sau đây. Tại sao "in Base" chỉ in một lần? Và tại sao không phải là "thiết lập trong cơ sở" in ở tất cả? Việc nhận/cài đặt thực tế dường như hoạt động tốt. Tôi đang thiếu gì?Tài sản Python

class Base: 
    def __init__(self): 
     self.s = "BaseStr" 

    def getstr(self): 
     print "get in Base" 
     return self.s 
    def setstr(self, s): 
     print "set in Base" 
     self.s = s 
    str = property(getstr, setstr) 

b = Base() 
print b.str 
b.str = "Foo" 
print b.str 

Output:

get in Base 
BaseStr 
Foo 

Trả lời

18

Bạn cần phải sử dụng new-style classes cho thuộc tính để làm việc một cách chính xác. Để làm như vậy lấy được lớp học của bạn từ object:

class Base(object): 
    ... 
+1

Phát hiện, cảm ơn bạn. :) – Mizipzor

+0

Và, đối với Python 3.x, bạn không cần phải làm điều này. Tất cả các lớp trong Python3 là kiểu mới. – treecoder

+1

Nhưng nếu tôi không phân lớp 'đối tượng', tôi vẫn có thể tạo' thuộc tính' trong lớp cổ điển, tại sao vậy? – Alcott

1

Bất cứ khi nào tạo ra một lớp mới, lấy được nó từ các loại object.