Tôi có một mô hình sau và lớp cơ sở trừu tượngMột mô hình django rằng lớp con một abc, cung cấp cho một cuộc xung đột metaclass
import abc
from django.db import models
class AbstractBase():
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def my_method(self):
return
class MyModel(models.Model, AbstractBase):
@abc.abstractmethod
def my_method(self):
return 1
Nhưng tôi nhận được lỗi sau.
xung đột metaclass: các metaclass của một lớp được thừa kế phải là một (không nghiêm ngặt) lớp con của các metaclasses của tất cả các căn cứ của nó
Tôi nghĩ vấn đề ở đây là (Vì nó được mô tả ở đây http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/) rằng hai lớp cơ sở có hai metaclasses khác nhau nên python không thể quyết định metaclass nào dùng cho đối tượng con.
Để giải quyết việc này tôi loại bỏ nhiều thừa kế và sử dụng theo phương pháp đăng ký để đăng ký lớp con
abc.register(Child)
Nhưng tôi không thực sự thích phương pháp này vì nó trông giống như khỉ vá.
Có cách nào khác để giải quyết vấn đề này không?
Tôi cố gắng gán mô hình Metaclass cho Trẻ em một cách rõ ràng nhưng nó không hoạt động. Tôi không tìm cách giải quyết nó bằng cách viết mã. Tôi nghĩ rằng điều này phải được giải quyết bằng cách thay đổi cấu trúc lớp học của tôi.
Tôi nghĩ rằng bạn sẽ phải tạo một metaclass mới mà cả hai điều của django và abc, có thể bằng cách gọi metaclasses tương ứng của họ theo thứ tự, có thể sử dụng thừa kế. – cha0site
Không có gì đáng ngờ khi sử dụng phương pháp abs.register - nó được thiết kế chính xác cho những trường hợp này. BTW, Python cách o f suy nghĩ mọi thứ được thực hiện vì vậy bạn hiếm khi nên _need_ giao diện và như vậy - có thể bạn đang quá hạn chế bởi cách mọi thứ được thực hiện bằng ngôn ngữ tĩnh? – jsbueno
@jsbueno - Bạn có thể đúng, nhưng tôi sẽ cần phải thực hiện chức năng giao diện theo một cách nào đó. Đây là một ví dụ cấy - https://gist.github.com/1559689. Có cách nào tốt hơn để thực hiện chức năng này, trong python? – yilmazhuseyin