Vì vậy, tôi đang đọc một chút về metaclasses trong Python, và cách thay đổi ba đối số của type()
được sử dụng để tạo động các lớp. Tuy nhiên, đối số thứ ba thường là dict
để khởi tạo biến được tạo ra '__dict__
.Metaclasses và __slots__?
Nếu tôi muốn tạo động các lớp học dựa trên metaclass sử dụng __slots__
thay vì __dict__
, tôi làm cách nào để thực hiện việc này? type()
vẫn được sử dụng trong một số thời trang cùng với ghi đè __new__()
?
Là một FYI, tôi biết về việc sử dụng thích hợp cho __slots__
, để tiết kiệm bộ nhớ khi tạo số lượng lớn một lớp so với lạm dụng nó để thực thi một dạng an toàn kiểu.
Ví dụ về một (kiểu mới) lớp bình thường mà bộ __metaclass__
và sử dụng một __dict__
:
class Meta(type):
def __new__(cls, name, bases, dctn):
# Do something unique ...
return type.__new__(cls, name, bases, dctn)
class Foo(object):
__metaclass__ = Meta
def __init__(self):
pass
Ở phía trên, type.__new__()
được gọi và đối số thứ tư (mà trở thành thứ ba khi thực tế sử dụng) tạo một __dict__
trong Foo
. Nhưng nếu tôi muốn sửa đổi Meta
để bao gồm __slots__
, thì tôi không có từ điển nào để chuyển sang chức năng type()
's __new__()
(theo như tôi biết - tôi chưa thử nghiệm bất kỳ điều nào trong số này, chỉ cân nhắc và cố gắng tìm một số loại kịch bản sử dụng).
Chỉnh sửa: Một dự đoán nhanh chóng, nhưng chưa được kiểm tra, là lấy một giá trị của các giá trị được đưa vào biến số __slots__
và chuyển nó đến type.__new__()
. Sau đó, thêm __init__()
vào Meta
để điền các biến số __slots__
từ dict. Mặc dù, tôi không chắc chắn như thế nào dict rằng sẽ đạt __init__()
, bởi vì việc kê khai của __slots__
ngăn __dict__
từ được tạo ra trừ khi __dict__
được định nghĩa trong __slots__
...
Điều này có vẻ thú vị. Tôi sẽ thử nó sau vài phút nữa. – Kumba
Không bao giờ có xung quanh để thử nghiệm này, nhưng tôi nghĩ rằng điều này kỹ thuật trả lời câu hỏi. Tôi sẽ tìm ra một ngày. – Kumba
Vừa mới đăng nhập trở lại SO trong độ tuổi; câu trả lời này là cuối cùng những gì làm việc. Cảm ơn! – Kumba