2009-04-20 33 views
6

Tôi đang cố gắng để làm việc hiểu những gì đang không làm việc trong mã này:Python Cmd mô-đun, vấn đề subclassing

#!/usr/bin/python 

import cmd 

class My_class (cmd.Cmd): 
    """docstring for Twitter_handler""" 
    def __init__(self): 
     super(My_class, self).__init__() 

if __name__ == '__main__': 
    my_handler = My_class() 

Đây là lỗi tôi nhận được

Traceback (most recent call last): 
    File "main.py", line 12, in <module> 
    my_handler = My_class() 
    File "main.py", line 9, in __init__ 
    super(My_class, self).__init__() 
TypeError: super() argument 1 must be type, not classobj 

Nếu tôi thay đổi lớp cha của "My_class "cho một đối tượng nó hoạt động tốt. Tôi làm sai ở đâu?

Trả lời

7

cmd.Cmd không phải là một kiểu class mới trong Python 2.5, 2.6, 2.7.

Lưu ý rằng mã của bạn không không tăng ngoại lệ trong Python 3.0.

+0

Có phải vì mô-đun cmd được viết lại bằng Python 3 không? – Teifion

+0

Không. Đó là bởi vì trong Python 3.0 tất cả các lớp là "các lớp kiểu mới". – Stephan202

+0

(Trên thực tế, sự khác biệt giữa cmd.py của 2.5 và 3.0 sẽ cho bạn thấy rằng rất ít thay đổi được thực hiện giữa các phiên bản đó.) – Stephan202

2

Vì vậy, nếu super() không hoạt động sử dụng:

import cmd 

class My_class(cmd.Cmd): 
    def __init__(self): 
     cmd.Cmd.__init__(self) 
1

Bạn vẫn có thể sử dụng super() nếu MyClass của bạn kéo dài object. Điều này hoạt động ngay cả khi mô-đun cmd.Cmdkhông phải là một lớp kiểu mới. Như thế này:

#!/usr/bin/python 

import cmd 

class My_class (cmd.Cmd, object): 
    """docstring for Twitter_handler""" 
    def __init__(self): 
     super(My_class, self).__init__() 

if __name__ == '__main__': 
    my_handler = My_class() 
+0

Điều này cũng phù hợp với tôi. Bất cứ ai có thể cân nhắc ở trên bất kỳ tác dụng phụ lạ trong Py2 hoặc Py3? – Technoloft