2013-06-11 33 views
9

Giả sử bạn có một cái gì đó giống nhưĐiều gì sẽ xảy ra nếu bạn trộn các lớp kiểu cũ và mới trong một hệ thống phân cấp?

class A(B1,B2): pass 
class B1(C1, C2): pass 
class B2: pass 
class C1(object): pass 
class C2: pass 

Làm thế nào để python cư xử liên quan đến thừa kế và trật tự giải quyết phương pháp khi bạn có một hệ thống phân cấp hỗn hợp? Liệu nó có tuân theo sự truyền tải cũ, sự truyền tải mới, một sự kết hợp của hai tùy thuộc vào nhánh của hệ thống phân cấp đang đi bộ hay không?

+1

woah ... dường như mọi người thích câu hỏi. Cảm ơn bạn –

Trả lời

2

Câu trả lời là "kết hợp cả hai". Bạn có thể tự kiểm tra bằng cách sử dụng inspect.getmro(), hoạt động trên cả các lớp kiểu cũ và kiểu mới. Nó trả về MRO, tức là thứ tự phân giải phương thức.

Bất kỳ lớp học kiểu cũ nào có MRO là cơ sở đầu tiên, từ đầu đến cuối. (Đây là một ý tưởng tồi cho các trường hợp phức tạp nhất, nhưng vẫn giữ khả năng tương thích là lạc hậu.) Chúng ta có thể thể hiện nó như thế này, mà làm việc vì MRO của mọi tầng lớp cha mẹ đã được tính toán:

mro(new_class) = [new_class] + mro(first_base) + mro(second_base) + ... 

Đối mới- lớp học phong cách, thuật toán sử dụng ý tưởng cơ bản giống nhau, nhưng là phức tạp hơn --- nó cũng bắt đầu với [new_class] nhưng được theo sau bởi một số kết hợp thông minh hơn của danh sách mro(first_base), mro(second_base) vv

Cho dù mỗi người trong các lớp học cơ sở là kiểu cũ hoặc kiểu mới, họ đã có MRO riêng của họ được tính trước đó, và các MRO này (như danh sách) là thứ duy nhất được sử dụng để tính toán MRO của lớp mới.

+0

Tôi nên thêm rằng 'inspect.getmro()' không bao giờ trả về hai lần cùng một lớp cơ sở, mặc dù nó có thể xảy ra với các hệ thống phân cấp kiểu cũ. Đó chỉ là một tác dụng phụ của việc sử dụng 'inspect.getmro()'; MRO thực tế trong trường hợp này thực sự tìm kiếm nhiều lần trong cùng một lớp cơ sở. –

1

Từ docs:

các tuyến tính của C là tổng của C cộng với việc hợp nhất của linearizations của cha mẹ và danh sách của cha mẹ.

Điều đó có nghĩa là nó phụ thuộc vào nhánh của hệ thống phân cấp mà nó hiện đang đi bộ (tức là hỗn hợp).

Nó phải được thực hiện đệ quy vì vậy tôi sẽ không mong đợi hành vi khác nhau.

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