Trường hợp sử dụng điển hình là: làm giàu mô-đun hiện tại (lớn) với một số (vài) thuộc tính động - mà không cần chuyển tất cả các thành phần mô-đun thành bố cục lớp. Thật không may là một bản vá lớp mô-đun đơn giản nhất như sys.modules[__name__].__class__ = MyPropertyModule
không thành công với TypeError: __class__ assignment: only for heap types
. Vì vậy, tạo mô-đun cần phải được rewired.
Cách tiếp cận này làm điều đó mà không móc nhập khẩu Python, chỉ bằng cách có một số prolog trên đầu trang của các mã mô-đun:
# 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)
Cách sử dụng:
>>> 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'"
Lưu ý: Một cái gì đó như from propertymodule import dynval
sẽ sản xuất một đông lạnh bản sao của khóa học - tương ứng với dynval = someobject.dynval
Có gì sai khi chỉ cần gọi một chức năng? –
muốn làm cho nó ít gõ để làm một số điều mà có được thực hiện rất nhiều. –