Vous devez répéter vos importations après avoir rechargé le sous-module "le plus à la feuille". Par exemple, étant donné:
$ mkdir myModule
$ touch myModule/__init__.py
$ cat >myModule/subModule.py
class MyClass(object): kind='first'
puis
>>> from myModule.subModule import MyClass
>>> MyClass.kind
'first'
et dans un autre terminal
$ cat >myModule/subModule.py
class MyClass(object): kind='second'
puis ...:
>>> import sys
>>> reload(sys.modules['myModule.subModule'])
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> from myModule.subModule import MyClass
>>> MyClass.kind
'second'
Vous devez passer par sys.modules
comme vous n'avez pas d'autre refe passer au sous-module, puis vous devez répéter le from
.
La vie est beaucoup plus simple si vous acceptez les conseils judicieux d'importer toujours un module, jamais des choses à l'intérieur du module, bien sûr - par exemple, la session Python serait (avec un changement à la sous-module avant la reload):
>>> from myModule import subModule as sm
>>> sm.MyClass.kind
'first'
>>> reload(sm)
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> sm.MyClass.kind
'second'
Si vous prenez l'habitude d'utiliser des noms qualifiés tels que sm.MyClass
au lieu de seulement le barename MyClass
, votre vie sera plus simple à bien des égards (plus facile est juste rechargement un d'entre eux ;-).
ma classe n'a pas d'attribut kind. peut-être une chose python 3.0 (j'ai 2.6.4). De toute façon, j'ai suivi votre conseil sur l'utilisation de noms qualifiés pour les sous-modules et tout fonctionne. merci beaucoup. j'aime aussi votre livre de livre de python. alex – alex
@alex, Je définis un attribut de manière à ce qu'il soit plus simple et plus facile de vérifier quelle version d'une classe est chargée - rien de spécial sur le nom et la valeur de l'attribut, juste un exemple. –