V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kingname
V2EX  ›  Python

[求助] Python 动态加载导致继承关系断裂的问题

  •  
  •   kingname ·
    kingname · 2015-04-03 15:22:49 +08:00 · 2458 次点击
    这是一个创建于 3513 天前的主题,其中的信息可能已经有所发展或是发生改变。

    baseclass.py文件

    class baseClass(object):
    def __init__(self,name= None,age= None):
    self.name = name
    self.age = age
    print 'baseclass'

    rootclass.py文件

    `from baseclass import baseClass

    class rootclass(baseClass):
    def init(self,name,age):
    baseClass.init(self, name, age)
    def myage(self):
    print 'my age is ' + str(self.age)`

    thesubclass.py文件

    import rootclass
    class grandfather(rootclass.rootclass):
    def __init__(self,address,work,name,age):
    rootclass.rootclass.__init__(self,name,age)
    self.address = address
    self.myage()

    verytop.py文件

    `import thesubclass

    class verytop:
    def init(self):
    b = thesubclass.grandfather(1, 2, 3, 4)`

    thetest.py 文件

    `while True:

    aMod = __import__('verytop', None, None, [''])
    CWD = os.path.dirname(os.path.realpath(__file__))
    if reloadModule(CWD): //reloadMoudule函数判断CWD路径下的文件是否修改,修改返回True
        print 'reload subclass'
        reload(aMod)
    x = getattr(aMod, 'verytop')
    m = x()
    time.sleep(5)`
    

    运行thetest.py文件,并让它一直跑着。当我修改rootclass.py文件并保存以后,程序会重新加载,然后就会报错

    TypeError: unbound method init() must be called with rootclass instance as first argument (got grandfather instance instead)

    目前的解法是:

    if reloadModule(CWD):
    print 'reload subclass'
    reload(aMod)
    bMod = __import__('thesubclass', None, None, [''])
    reload(bMod)

    把子类也reload进来就正常了。

    但是我的问题是,bMod必须放在aMod的后面,否则仍然会报错。但是由于我的project中,涉及到很多的类,我并不知道代码里面父类和子类的关系,所以不知道谁放前面,谁放后面。

    求问应该怎么办?

    12 条回复    2015-04-03 17:46:57 +08:00
    kingname
        1
    kingname  
    OP
       2015-04-03 15:28:32 +08:00
    V2ex编辑器markdown方式显示源代码有问题啊。。。。
    ruoyu0088
        2
    ruoyu0088  
       2015-04-03 15:47:57 +08:00
    在reload之前,将你自己的编写的所有模块都从sys.modules中删除。
    kingname
        3
    kingname  
    OP
       2015-04-03 15:58:46 +08:00
    @ruoyu0088 使用del sys.modules['name']这样删除吗?
    hahastudio
        4
    hahastudio  
       2015-04-03 16:05:29 +08:00
    这里的最佳答案会有些帮助
    http://stackoverflow.com/questions/744373/circular-or-cyclic-imports-in-python
    很有可能就是因为子类依然在 sys.modules 里面,所以没有更新

    看到这篇 blog 是用 imp 做的,可能会对你有帮助
    https://stamat.wordpress.com/2013/06/30/dynamic-module-import-in-python/
    messense
        5
    messense  
       2015-04-03 16:23:23 +08:00
    Poor code style...... Why don't you use super(baseClass, self).__init__(...) ?
    messense
        6
    messense  
       2015-04-03 16:24:03 +08:00
    @messense Typo. Should be super(rootClass, self).__init__(...)
    kingname
        7
    kingname  
    OP
       2015-04-03 16:35:06 +08:00
    @messense It is Python, not Java
    kingname
        8
    kingname  
    OP
       2015-04-03 16:45:02 +08:00
    @hahastudio 我的问题不是更不更新的问题,而是报错的问题。。。
    messense
        9
    messense  
       2015-04-03 16:59:25 +08:00
    hahastudio
        10
    hahastudio  
       2015-04-03 17:01:25 +08:00
    @kingname 看了你的说法,就是说如果你不重载入子类,它就会报错,所以我觉得好像是你的更新 module 的方式会产生问题
    哦,看了一下 init,为什么不用 super 呢?
    kingname
        11
    kingname  
    OP
       2015-04-03 17:08:54 +08:00
    @hahastudio 我用了super以后,仍然必须要重新reload thesubclass这个类,才可以正常使用
    ruoyu0088
        12
    ruoyu0088  
       2015-04-03 17:46:57 +08:00
    是啊,对sys.modules进行循环,如果是自己的模块就从该字典删除。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:49 · PVG 10:49 · LAX 18:49 · JFK 21:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.