Kısa bir cevap: kullanım proxy_tools
proxy_tools
Paket sağlamak için çalışır @module_property
özelliğe.
İle kurulur
pip install proxy_tools
İçinde, Marein en Örneğin @ hafif bir modifikasyon kullanma the_module.py
koyduk
from proxy_tools import module_property
@module_property
def thing():
print(". ", end='')
return 'hello'
Şimdi başka bir senaryodan yapabilirim
import the_module
print(the_module.thing)
Beklenmeyen davranış
Bu çözüm uyarılardan yoksun değildir. Yani the_module.thing
olan bir dize değil ! proxy_tools.Proxy
Bir dizgeyi taklit edecek şekilde özel yöntemleri geçersiz kılınmış bir nesnedir. İşte bu noktayı gösteren bazı temel testler:
res = the_module.thing
print(type(res))
print(isinstance(res, str))
print(res)
print(res + " there")
print(isinstance(res + "", str))
print(res.split('e'))
Dahili olarak, orijinal işlev şu amaçlarla saklanır the_module.thing._Proxy__local
:
print(res._Proxy__local)
Diğer düşünceler
Dürüst olmak gerekirse, modüllerin neden bu işlevselliğe sahip olmadığı konusunda şaşkınım. Bence sorunun özü the_module
, types.ModuleType
sınıfın bir örneği . Bir "modül özelliği" ayarlamak , sınıfın kendisi yerine bu sınıfın bir örneğinde bir özellik ayarlamak anlamına types.ModuleType
gelir. Daha fazla ayrıntı için bu yanıta bakın .
types.ModuleType
Sonuçlar harika olmasa da özellikleri aşağıdaki gibi uygulayabiliriz . Yerleşik türleri doğrudan değiştiremeyiz, ancak onları lanetleyebiliriz :
from forbiddenfruit import curse
from types import ModuleType
curse(ModuleType, "thing2", property(lambda module: f'hi from {module.__name__}'))
Bu bize tüm modüllerde var olan bir özellik verir. Tüm modüllerde ayar davranışını bozduğumuz için bu biraz zahmetli:
import sys
print(sys.thing2)
sys.thing2 = 5
__getattr__
bir modüle bakın .