2012-11-16 27 views

Trả lời

14

Trong Python2, khai báo object làm lớp cơ sở làm cho lớp là new-style class. Nếu không, đó là một lớp "cổ điển". Trong số những khác biệt này mà

  • Thuộc tính chỉ làm việc với các lớp học kiểu mới

  • lớp kiểu mới có mro method

  • lớp kiểu mới có nhiều thuộc tính mà các lớp học kinh điển thiếu

    In [288]: class Foo: pass 
    In [289]: dir(Foo) 
    Out[289]: ['__doc__', '__module__'] 
    
    In [290]: class Bar(object): pass 
    In [291]: dir(Bar) 
    Out[291]: ['__class__', '__delattr__',  '__dict__', '__doc__', '__format__', '__getattribute__',  '__hash__', '__init__', '__module__', '__new__', '__reduce__',  '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',  '__str__', '__subclasshook__', '__weakref__'] 
    

Lớp học các lớp ic được giữ lại trong Python2 chỉ cho khả năng tương thích ngược. Tất cả các lớp tùy chỉnh mà bạn xác định phải được tạo kiểu mới.

Trong Python3, tất cả các lớp đều có kiểu mới, do đó không cần khai báo rõ ràng ở đó.

+0

+1 cho điều này! Là một sang một bên: AFAIK không có nhược điểm để sử dụng các lớp học theo phong cách mới, vì vậy tôi cảm thấy rằng bạn nên sử dụng chúng tất cả các thời gian, mà không có ngoại lệ. Các lớp kiểu cũ chỉ tồn tại, như tên của nó, cho khả năng tương thích ngược (đó là lý do tại sao chúng cuối cùng đã được gỡ bỏ trong Python 3.0). –

+0

Cảm ơn bạn đã cung cấp nhiều cái cũ, một cái mới. Tôi đánh giá cao khi mọi người dành thời gian để giúp người khác học hỏi. – Paxwell

+0

Tôi có thể nghĩ ra một lợi thế không thường xuyên của các lớp kiểu cũ: tra cứu phương pháp đặc biệt có thể là trên cá thể. Ví dụ. 'a = oldstyle(); a .__ add__ = lambda * args: 'changed'' sẽ hoạt động nhưng tương đương với đối tượng newstyle thì không. Có lẽ một hoặc hai lần tôi ước gì điều này sẽ hoạt động mà không tạo ra một lớp mới thay vào đó, nhưng đó là nó, và chủ yếu nó là một dấu hiệu mà cấu trúc của tôi cần xem xét lại. – DSM

0

Trong Python 2, object biến nó thành "lớp kiểu mới". Các chi tiết về điều này có nghĩa là không quá quan trọng, nhưng dòng dưới cùng là bạn nên luôn luôn sử dụng nó hoặc một số điều có thể không hoạt động đúng.

Trong Python 3, mọi thứ luôn là một lớp kiểu mới, vì vậy bạn không cần sử dụng object ở đó.

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