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 ở đó.
+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). –
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
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