2010-04-28 32 views
8

Tất cả các lớp bắt nguồn từ một lớp cơ sở nhất định phải định nghĩa một thuộc tính được gọi là "đường dẫn". Trong cảm giác gõ vịt tôi có thể dựa vào định nghĩa trong lớp con:Truyền tham số cho hàm tạo lớp cơ sở hoặc sử dụng biến mẫu?

class Base: 
    pass # no "path" variable here 

def Sub(Base): 
    def __init__(self): 
     self.path = "something/" 

possiblity khác sẽ được sử dụng các constructor lớp cơ sở:

class Base: 
    def __init__(self, path): 
     self.path = path 

def Sub(Base): 
    def __init__(self): 
     super().__init__("something/") 

tôi sử dụng Python 3.1.

Bạn thích điều gì hơn và tại sao? Có cách nào tốt hơn?

Trả lời

11

Trong Python 3.0+:
Tôi sẽ đi với tham số cho hàm tạo của lớp cơ sở như bạn có trong ví dụ thứ hai. Khi các lớp lực này bắt nguồn từ Base để cung cấp thuộc tính đường dẫn cần thiết, nó ghi lại sự thật rằng lớp đó có một thuộc tính như vậy và các lớp dẫn xuất được yêu cầu cung cấp nó. Nếu không có nó, bạn sẽ dựa vào điều này được tuyên bố (và đọc) một nơi nào đó trong tài liệu của lớp học của bạn, mặc dù nó chắc chắn không giúp đỡ để cũng nhà nước trong docstring những gì tài sản cụ thể có nghĩa là.

Trong Python 2.6+:
Tôi sẽ không sử dụng những điều trên; thay vào đó tôi sẽ sử dụng:

class Base(object): 
    def __init__(self,path): 
     self.path=path; 

class Sub(Base): 
    def __init__(self): 
     Base.__init__(self,"something/") 

Nói cách khác, tôi sẽ yêu cầu như một tham số trong constructor lớp cơ sở, bởi vì nó tài liệu thực tế là tất cả các loại như vậy sẽ có/sử dụng/cần điều đó thông số cụ thể và rằng tham số cần được chứng minh. Tuy nhiên, tôi sẽ không sử dụng super() là super is somewhat fragile and dangerous in Python và tôi cũng sẽ tạo Base bằng cách thừa kế từ đối tượng (hoặc từ một số kiểu mới khác).

+5

Không có gì mong manh về 'super()'. Sự mong manh là trong cú pháp 2.x, được cố định trong 3.x (mà OP đang sử dụng, như được hiển thị bởi 'super()' call), và nhiều thừa kế nói chung. Không có lý do gì để gọi phương thức baseclass trực tiếp trong Python 3.x, cú pháp 'super() .__ init (...)' không bao giờ tệ hơn và thường tốt hơn. –

+0

đánh giá bằng cách sử dụng 'super', tôi đoán rằng deamon đang sử dụng py3k – SilentGhost

+0

@Thomas Wouters: làm thế nào bạn sẽ sử dụng siêu nếu bạn tất cả các thừa kế và lớp cơ sở với chữ ký constructor khác nhau? Vượt qua tất cả các đối số của các lớp dẫn xuất cho tất cả các lớp cơ sở trông giống như một hack bẩn, dựa vào các tham số có tên và để các lớp cơ sở phân loại những gì chúng cần là không đẹp hơn nhiều. – kriss

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