Không, bạn chỉ có thể chỉ định metaclass cho mỗi lớp hoặc mỗi mô-đun. Bạn không thể đặt nó cho toàn bộ gói.
Trong Python 3.1 trở lên, bạn có thể chặn móc builtins.__build_class__
và chèn một metaclass theo chương trình, xem Overriding the default type() metaclass before Python runs.
Trong Python 2.7, bạn có thể thay thế __builtins__.object
bằng một lớp con sử dụng metaclass của bạn. Giống như móc builtins.__build_class__
, đây là hack tiên tiến và ngắt mã của bạn nhiều như nhận được metaclass của bạn ở mọi nơi.
Làm như vậy bằng cách thay thế object
tham chiếu trên __builtin__
module:
import __builtin__
class MetaClass(type):
def __new__(mcls, name, *args):
# do something in the metaclass
return super(MetaClass, mcls).__new__(mcls, name, *args)
orig_object = __builtin__.orig_object
class metaobject(orig_object):
__metaclass__ = MetaClass
def enable():
# *replace* object with one that uses your metaclass
__builtin__.object = metaobject
def disable():
__builtin__.object = orig_object
Run enable()
này trước khi nhập gói của bạn và tất cả các lớp học kiểu mới (những người mà thể hỗ trợ một metaclass) sẽ có metaclass của bạn. Lưu ý rằng hành vi này hiện sẽ lan truyền đến tất cả Mã Python chưa được tải, bao gồm thư viện chuẩn, như mã nhập gói của bạn. Bạn có thể muốn sử dụng:
enable()
import package
disable()
để giới hạn hiệu ứng.
Nguồn
2013-04-23 20:27:34
@slashdottir: có bạn đi, trả lời cập nhật để trang trải 2.7. Đó là một hack khác. –