एक सामान्य उपयोग केस है: कुछ (कुछ) गतिशील विशेषताओं के साथ एक (विशाल) मौजूदा मॉड्यूल को समृद्ध करना - सभी मॉड्यूल सामान को क्लास लेआउट में बदल दिए बिना। दुर्भाग्यवश sys.modules[__name__].__class__ = MyPropertyModule
जैसे सबसे सरल मॉड्यूल क्लास पैच TypeError: __class__ assignment: only for heap types
के साथ विफल रहता है। तो मॉड्यूल निर्माण को फिर से चालू करने की जरूरत है।
यह दृष्टिकोण अजगर आयात हुक के बिना यह होता है, बस मॉड्यूल कोड के शीर्ष पर कुछ prolog होने से:
# propertymodule.py
""" Module property example """
if '__orgmod__' not in globals():
# constant prolog for having module properties/supports reload()
print "PropertyModule stub execution", __name__
import sys, types
class PropertyModule(types.ModuleType):
def __str__(self):
return "<PropertyModule %r from %r>" % (self.__name__, self.__file__)
modnew = PropertyModule(__name__, __doc__)
modnew.__modclass__ = PropertyModule
modnew.__file__ = __file__
modnew.__orgmod__ = sys.modules[__name__]
sys.modules[__name__] = modnew
exec sys._getframe().f_code in modnew.__dict__
else:
# normal module code (usually vast) ..
print "regular module execution"
a = 7
def get_dynval(module):
return "property function returns %s in module %r" % (a * 4, module.__name__)
__modclass__.dynval = property(get_dynval)
उपयोग:
>>> import propertymodule
PropertyModule stub execution propertymodule
regular module execution
>>> propertymodule.dynval
"property function returns 28 in module 'propertymodule'"
>>> reload(propertymodule) # AFTER EDITS
regular module execution
<module 'propertymodule' from 'propertymodule.pyc'>
>>> propertymodule.dynval
"property function returns 36 in module 'propertymodule'"
नोट: from propertymodule import dynval
तरह एक जमे हुए उत्पादन करेगा पाठ्यक्रम की प्रति - dynval = someobject.dynval
फ़ंक्शन को कॉल करने में क्या गड़बड़ है? –
कुछ चीजें करने के लिए इसे कम टाइप करना चाहते हैं जो बहुत कुछ किया जाता है। –