2012-10-03 34 views
21

tôi đã tạo ra một lớp cơ sở:Làm thế nào để mở rộng Python lớp init

class Thing(): 
    def __init__(self, name): 
     self.name = name 

Tôi muốn mở rộng các lớp và thêm vào init phương pháp nên rằng SubThing có cả một name và một tài sản time. Tôi phải làm nó như thế nào?

class SubThing(Thing): 
    # something here to extend the init and add a "time" property 

    def __repr__(self): 
     return '<%s %s>' % (self.name, self.time) 

Mọi trợ giúp đều tuyệt vời.

Trả lời

27

Bạn chỉ có thể xác định __init__ trong subclass và gọi super gọi __init__ phương pháp của cha mẹ một cách thích hợp:

class SubThing(Thing): 
    def __init__(self, *args, **kwargs): 
     super(SubThing, self).__init__(*args, **kwargs) 
     self.time = datetime.now() 

Hãy chắc chắn để có lớp lớp cơ sở của bạn từ object mặc dù, như super sẽ không hoạt động với các lớp học kiểu cũ:

class Thing(object): 
    ... 
+14

Cũng thay vì tham chiếu 'SubThing' trong' super', bạn có thể làm 'super (self .__ class__, self) .__ init __ (* args, ** kwargs)'. Điều này cũng làm việc với các lớp được tạo động bằng cách sử dụng 'type()'. – miki725

+3

Tôi nhận được lỗi này với một trong các giải pháp sau: 'TypeError: phải là loại, không phải classobj' - lỗi được kích hoạt bởi siêu dòng của tôi. – TheChymera

+1

@TheChymera nhìn vào những gì Jesse đã viết: "Hãy chắc chắn rằng bạn có lớp con cơ sở của bạn từ đối tượng, vì siêu sẽ không hoạt động với các lớp kiểu cũ" – Acsisr

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