2012-07-04 31 views
5

Khởi tạo đối tượng Foo chạy phương thức func(), nhưng giá trị của self.a được đặt thành None anyway.Không thể đặt thuộc tính lớp trong python bằng cách sử dụng phương thức

Tôi làm cách nào để mã sau hoạt động?

#!/usr/bin/env python 

class Foo(object): 

    def __init__(self, num): 
     self.a = self.func(num) 
     print self.a 

    def func(self, num): 
     self.a = range(num) 
     print self.a 

    def __str__(self): 
     return str(self.a) 


def main(): 
    f = Foo(20) 
    print f 

if __name__ == "__main__": 
    main() 

Đầu ra là:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
None 
None 
+0

Bạn không có bất kỳ thuộc tính lớp nào, chỉ các thuộc tính mẫu. –

Trả lời

9

Bạn đang đặt self.a với giá trị trả về của hàm. Vì hàm không trả về giá trị nào, giá trị được đặt thành None.

def __init__(self, num): 
    self.a = self.func(num) # return value of function is None 
    print self.a    # self.a is now None 

def func(self, num): 
    self.a = range(num)  # sets self.a to [0..19] 
    print self.a    # prints [0..19] 
    # implicit "return None" 
3

jterrace là chính xác. Điều đang xảy ra là phương thức func() được in trước, không phải phương thức init. Hãy xem xét chương trình này:

#!/usr/bin/env python 

class Foo(object): 

    def __init__(self, num): 
     self.a = self.func(num) 
     print '__init__:', self.a 

    def func(self, num): 
     self.a = range(num) 
     print 'func:', self.a 

    def __str__(self): 
     return str(self.a) 

if __name__ == '__main__': 
    f = Foo(20) 
    print '__main__:', f 

Nó rất giống như của bạn ngoại trừ tôi thêm __init__:, func:, và __main__: để báo cáo in chức năng tương ứng của. Chạy cái này và bạn nên hiểu rõ hơn về những gì đang xảy ra.

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