नहीं, आप प्रति वर्ग या प्रति मॉड्यूल केवल मेटाक्लास निर्दिष्ट कर सकते हैं। आप इसे पूरे पैकेज के लिए सेट नहीं कर सकते हैं।
अजगर 3.1 में और उसके बाद, आप कर सकते हैं अवरोधन builtins.__build_class__
हुक और प्रोग्राम के एक metaclass डालें, Overriding the default type() metaclass before Python runs देखते हैं।
पायथन 2.7 में, आप __builtins__.object
को अपने मेटाक्लास का उपयोग करने वाले उप-वर्ग के साथ प्रतिस्थापित कर सकते हैं। builtins.__build_class__
हुक की तरह, यह उन्नत हैकरी है और अपना कोड कहीं भी कहीं भी अपना मेटाक्लास प्राप्त करने के साथ तोड़ दें। अपने पैकेज और सभी नई शैली वर्गों (उन है कि एक metaclass समर्थन कर सकते हैं) का आयात अपने metaclass होगा पहले
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
भागो enable()
इस:
__builtin__
module पर object
संदर्भ बदल कर ऐसा करते हैं। ध्यान दें कि यह व्यवहार अब पर प्रचार करेगा सभी मानक लाइब्रेरी समेत पाइथन कोड पहले से लोड नहीं हुआ है, क्योंकि आपका पैकेज आयात कोड करता है। आप शायद उपयोग करना चाहते हैं:
enable()
import package
disable()
प्रभाव को सीमित करने के लिए।
स्रोत
2013-04-23 20:27:34
@ स्लैशडॉटिर: वहां आप जाते हैं, उत्तर 2.7 को अपडेट करने के लिए अपडेट किया गया है। यह अभी तक एक और हैक है। –