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中,涉及到很多的类,我并不知道代码里面父类和子类的关系,所以不知道谁放前面,谁放后面。
求问应该怎么办?
1
kingname OP V2ex编辑器markdown方式显示源代码有问题啊。。。。
|
2
ruoyu0088 2015-04-03 15:47:57 +08:00
在reload之前,将你自己的编写的所有模块都从sys.modules中删除。
|
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/ |
5
messense 2015-04-03 16:23:23 +08:00
Poor code style...... Why don't you use super(baseClass, self).__init__(...) ?
|
6
messense 2015-04-03 16:24:03 +08:00
@messense Typo. Should be super(rootClass, self).__init__(...)
|
8
kingname OP @hahastudio 我的问题不是更不更新的问题,而是报错的问题。。。
|
9
messense 2015-04-03 16:59:25 +08:00
|
10
hahastudio 2015-04-03 17:01:25 +08:00
@kingname 看了你的说法,就是说如果你不重载入子类,它就会报错,所以我觉得好像是你的更新 module 的方式会产生问题
哦,看了一下 init,为什么不用 super 呢? |
11
kingname OP @hahastudio 我用了super以后,仍然必须要重新reload thesubclass这个类,才可以正常使用
|
12
ruoyu0088 2015-04-03 17:46:57 +08:00
是啊,对sys.modules进行循环,如果是自己的模块就从该字典删除。
|