Bài viết này có một đoạn mã hiển thị cách sử dụng __bases__
để thay đổi động phân cấp kế thừa của một số mã Python, bằng cách thêm một lớp vào tập hợp các lớp hiện có của các lớp mà từ đó nó kế thừa. Ok, điều đó khó đọc, mã có lẽ rõ ràng hơn:
class Friendly:
def hello(self):
print 'Hello'
class Person: pass
p = Person()
Person.__bases__ = (Friendly,)
p.hello() # prints "Hello"
Có nghĩa là, Person
không kế thừa từ Friendly
cấp nguồn, mà quan hệ kế thừa này được thêm động vào thời gian chạy bằng cách sửa đổi __bases__
thuộc tính của lớp Người. Tuy nhiên, nếu bạn thay đổi Friendly
và Person
trở thành các lớp kiểu mới (bằng cách kế thừa từ đối tượng), bạn sẽ gặp lỗi sau:
TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Một chút của Google về điều này dường như chỉ ra một số điểm không tương thích giữa các lớp kiểu mới và kiểu cũ liên quan đến việc thay đổi hệ thống phân cấp kế thừa trong thời gian chạy. Cụ thể: "Các đối tượng lớp kiểu mới không hỗ trợ gán cho thuộc tính base của chúng " .
Câu hỏi của tôi, liệu có thể làm cho ví dụ Thân thiện / Người ở trên hoạt động bằng cách sử dụng các lớp kiểu mới trong Python 2.7+, có thể bằng cách sử dụng __mro__
thuộc tính không?
Tuyên bố từ chối trách nhiệm: Tôi hoàn toàn nhận ra rằng đây là mã tối nghĩa. Tôi hoàn toàn nhận thấy rằng trong các thủ thuật mã sản xuất thực tế như thế này có xu hướng không thể đọc được, đây hoàn toàn là một thử nghiệm suy nghĩ và đối với những người đam mê tìm hiểu điều gì đó về cách Python giải quyết các vấn đề liên quan đến đa kế thừa.