Sau this answer có vẻ như một lớp metaclass có thể thay đổi sau khi lớp học đã được xác định bằng cách sử dụng như sau *:Thiết lập một lớp metaclass sử dụng một trang trí
class MyMetaClass(type):
# Metaclass magic...
class A(object):
pass
A = MyMetaClass(A.__name__, A.__bases__, dict(A.__dict__))
Định nghĩa một hàm
def metaclass_wrapper(cls):
return MyMetaClass(cls.__name__, cls.__bases__, dict(cls.__dict__))
cho phép tôi để áp dụng một trang trí cho một định nghĩa lớp như vậy,
@metaclass_wrapper
class B(object):
pass
Nó thấy ms rằng ma thuật metaclass được áp dụng cho B
, tuy nhiên B
không có thuộc tính __metaclass__
. Là các phương pháp trên một cách hợp lý để áp dụng metaclasses để định nghĩa lớp, mặc dù tôi đang definiting và tái definiting một lớp học, hoặc tôi sẽ khấm khá hơn chỉ đơn giản là viết
class B(object):
__metaclass__ = MyMetaClass
pass
Tôi đoán có một số khác biệt giữa hai phương pháp.
* Lưu ý, câu trả lời ban đầu trong câu hỏi liên quan, MyMetaClass(A.__name__, A.__bases__, A.__dict__)
, trả về một TypeError
:
TypeError: type() argument 3 must be a dict, not dict_proxy
Dường như __dict__
thuộc tính của A
(định nghĩa lớp) có một loại dict_proxy
, trong khi loại thuộc tính __dict__
của một ví dụ của A
có loại dict
. Tại sao điều này? Đây có phải là sự khác biệt giữa Python 2.x và 3.x không?
Tôi đã tự hỏi liệu có một trang trí tương đương với việc đặt thuộc tính '__metaclass__' trong định nghĩa lớp hay không. Tôi đoán một phần khác của câu hỏi của tôi là 'trang trí' của tôi đã làm * có vẻ * để làm việc, nhưng tôi nhận thấy rằng lớp trang trí không có thuộc tính '__metaclass__', vì vậy rõ ràng có sự khác biệt giữa hai phương pháp; tại sao thế này – Chris