Tipik kullanım durumu: bazı (az) dinamik özniteliklerle (büyük) mevcut bir modülü zenginleştirme - tüm modül öğelerini sınıf düzenine çevirmeden. sys.modules[__name__].__class__ = MyPropertyModule
gibi en basit bir modül sınıfı yama, TypeError: __class__ assignment: only for heap types
ile başarısız oluyor. Böylece modül oluşturma işleminin yeniden yapılması gerekir.
# 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)
Kullanımı:
>>> 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'"
Not: from propertymodule import dynval
gibi bir şey donmuş üretecek
Bu yaklaşım sadece modül kodunun üzerine bazı prolog alarak, Python ithalat kanca olmadan yapıyor kursun kopyası - dynval = someobject.dynval
Tekabül eden bir işlev çağırmakla ilgili sorun nedir? –
, çok şey yapan bazı şeyleri daha az yazarak yapmak ister. –