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

2015-04-03 15:22:49 +08:00
 kingname

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中,涉及到很多的类,我并不知道代码里面父类和子类的关系,所以不知道谁放前面,谁放后面。

求问应该怎么办?

2396 次点击
所在节点    Python
12 条回复
kingname
2015-04-03 15:28:32 +08:00
V2ex编辑器markdown方式显示源代码有问题啊。。。。
ruoyu0088
2015-04-03 15:47:57 +08:00
在reload之前,将你自己的编写的所有模块都从sys.modules中删除。
kingname
2015-04-03 15:58:46 +08:00
@ruoyu0088 使用del sys.modules['name']这样删除吗?
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
2015-04-03 16:23:23 +08:00
Poor code style...... Why don't you use super(baseClass, self).__init__(...) ?
messense
2015-04-03 16:24:03 +08:00
@messense Typo. Should be super(rootClass, self).__init__(...)
kingname
2015-04-03 16:35:06 +08:00
@messense It is Python, not Java
kingname
2015-04-03 16:45:02 +08:00
@hahastudio 我的问题不是更不更新的问题,而是报错的问题。。。
messense
2015-04-03 16:59:25 +08:00
hahastudio
2015-04-03 17:01:25 +08:00
@kingname 看了你的说法,就是说如果你不重载入子类,它就会报错,所以我觉得好像是你的更新 module 的方式会产生问题
哦,看了一下 init,为什么不用 super 呢?
kingname
2015-04-03 17:08:54 +08:00
@hahastudio 我用了super以后,仍然必须要重新reload thesubclass这个类,才可以正常使用
ruoyu0088
2015-04-03 17:46:57 +08:00
是啊,对sys.modules进行循环,如果是自己的模块就从该字典删除。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181362

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX