2016-09-15 13 views
5

Đây là một lớp học kiểu cũ:Là phân lớp từ đối tượng giống như xác định loại như metaclass?

class OldStyle: 
    pass 

Đây là một lớp học kiểu mới:

class NewStyle(object): 
    pass 

Đây cũng là một lớp học kiểu mới:

class NewStyle2: 
    __metaclass__ = type 

Có bất kỳ sự khác biệt nào giữa NewStyleNewStyle2?

Tôi có ấn tượng rằng tác dụng duy nhất của kế thừa từ object thực sự là để xác định type metaclass, nhưng tôi không thể tìm thấy bất kỳ xác nhận nào, ngoài việc tôi không thấy bất kỳ sự khác biệt nào.

Trả lời

2

Khá nhiều, không có sự khác biệt giữa NewStyleNewStyle2. Cả hai đều thuộc loại type trong khi OldStyle loại classobj.

Nếu bạn phân lớp từ đối tượng, thì __class__ of object (meaning type) is going sẽ được sử dụng; nếu bạn cung cấp __metaclass__ that is going to get picked up.

Nếu không có gì được cung cấp dưới dạng __metaclass__ và bạn không được kế thừa từ object, Py_ClassType is assigned as the metaclass cho bạn.

Trong mọi trường hợp, metaclass.__new__ sẽ được gọi. Đối với Py_ClassType.__new__ nó theo các ngữ nghĩa được xác định (tôi chưa bao giờ kiểm tra chúng, thực sự) và cho type.__new__ it makes sure to pack object trong các căn cứ của lớp học của bạn.

Tất nhiên, một hiệu ứng tương tự được thực hiện bởi:

cls = type("NewStyle3",(), {}) 

nơi một cuộc gọi ngay lập tức được thực hiện để type; nó chỉ là một rắc rối lớn hơn :-)

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