2012-07-22 34 views
7

Vì vậy ... Tôi đang cố gắng chuyển từ Python cơ bản sang một số chương trình GUI, sử dụng PyQt4. Tôi đang xem một vài cuốn sách và hướng dẫn khác nhau, và chúng dường như có một cách khác nhau để bắt đầu định nghĩa lớp.Các cách khác nhau để sử dụng __init__ cho PyQt4

Một hướng dẫn bắt đầu ra khỏi lớp học như vậy:

class Example(QtGui.QDialog): 
    def __init__(self): 
     super(Example, self).__init__() 

cuốn sách khác thực hiện nó như thế này:

class Example(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(Example, self).__init__(parent) 

Tuy nhiên khác thì nó theo cách này:

class Example(QtGui.QDialog): 
    def__init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

tôi vẫn đang cố gắng để bọc tâm trí của tôi xung quanh các lớp học và OOP và super() và tất cả ... tôi có đúng trong suy nghĩ rằng dòng cuối cùng của ví dụ thứ ba hoàn thành nhiều hay ít điều tương tự như các cuộc gọi bằng cách sử dụng super() trong các ví dụ trước, bằng cách gọi trực tiếp lớp cơ sở một cách rõ ràng? Đối với các ví dụ tương đối đơn giản như thế này, tức là thừa kế đơn lẻ, có bất kỳ lợi ích thực sự hoặc lý do nào để sử dụng một cách so với cách khác hay không? Cuối cùng ... ví dụ thứ hai chuyển số parent làm đối số cho super() trong khi đầu tiên không ... bất kỳ phỏng đoán/giải thích nào về lý do tại sao/khi nào/ở đâu thích hợp?

Trả lời

8

Cách đầu tiên đơn giản là không hỗ trợ chuyển đối số parent cho lớp cơ sở của nó. Nếu bạn biết rằng bạn sẽ không bao giờ cần số parent arg, điều đó là tốt, nhưng điều này ít linh hoạt hơn.

Vì ví dụ này chỉ có một thừa kế đơn lẻ, super(Example, self).__init__(parent) giống hệt như QtGui.QDialog.__init__(self, parent); những ứng dụng cũ super để có được một "phiên bản" của self rằng Calles QtGui.QDialog 's phương pháp thay vì Example' s, do đó self được tự động bao gồm, trong khi sau này trực tiếp gọi hàm QtGui.QDialog.__init__ và rõ ràng vượt qua selfparent đối số. Trong thừa kế duy nhất không có sự khác biệt AFAIK khác với số lượng gõ và thực tế là bạn phải thay đổi tên lớp nếu bạn thay đổi kế thừa. Trong nhiều thừa kế, super giải quyết các phương thức bán thông minh.

Ví dụ thứ ba thực sự sử dụng QWidget thay vì QDialog, điều này hơi lạ; có lẽ là công trình bởi vì QDialog là một phân lớp của QWidget và không làm bất cứ điều gì có ý nghĩa trong __init__ của nó, nhưng tôi không biết chắc chắn.

+0

Bạn là * typer trả lời nhanh * cách trước tôi – Hubro

+1

@Codemonkey 7 phút sau khi câu hỏi được hỏi, không * nhanh *. :) – Dougal

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