Tôi đang cố gắng để viết một metaclass chung để theo dõi các lớp conGeneric Python metaclass để theo dõi các lớp con
Vì tôi muốn đây là chung chung, tôi không muốn để bất kỳ hardcode tên lớp trong metaclass này, do đó tôi đã đưa ra một chức năng mà tạo ra các metaclass thích hợp, một cái gì đó như:
def make_subtracker(root):
class SubclassTracker(type):
def __init__(cls, name, bases, dct):
print('registering %s' % (name,))
root._registry.append(cls)
super(SubclassTracker, cls).__init__(name, bases, dct)
return SubclassTracker
bằng cách này tôi có thể gọi nó để tạo ra một metaclass cho một cụ thể gốc lớp với:
__metaclass__ = make_subtracker(Root)
Đây là nơi tôi gặp phải sự cố. Tôi không thể làm điều này:
class Root(object):
_registry = []
__metaclass__ = make_subtracker(Root)
... vì Root
không được định nghĩa nhưng khi tôi sử dụng make_subtracker(Root)
. Tôi đã cố gắng thêm metaclass thuộc tính sau, do đó ít nhất nó có thể được áp dụng trong các lớp con:
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
... nhưng điều này không hoạt động. metaclass có xử lý đặc biệt khi định nghĩa lớp được đọc, theo quy định tại http://docs.python.org/reference/datamodel.html#customizing-class-creation
Tôi đang tìm gợi ý để làm được điều này (hoặc thay đổi một metaclass lớp trong thời gian chạy theo một cách mà nó được áp dụng cho các lớp con của nó hoặc bất kỳ phương án thay thế nào khác).
Vui lòng không làm điều này. Folks người đến sau khi bạn sẽ rip nó ra bởi vì nó quá phức tạp. Vui lòng sử dụng chức năng của nhà máy để tạo các đối tượng của lớp con thích hợp. –