2012-08-16 279 views
-1

也许愚蠢的问题调用类的,我读过很多关于这里的类似线程,但仍无法捉摸了答案:从导入模块

在main.py

from userMod import * 

class Handler(webapp2.RequestHandler): 
    def write(self): #some code here etc 

在userMod.py

class signup(Handler): 
    def get(self): #some code here etc 

我收到一个错误,说Handler没有定义。我简单但明显愚蠢的问题是,如何从加载模块中的父脚本访问类?还是仅仅需要在我创建的每个模块中复制Handler?

请记住,我对Python很陌生,试图通过拆分某些类型的函数(在本例中为我正在构建的站点的用户登录和注册组件)来使代码更加模块化。

+1

这不是导入工作的方式。 http://docs.python.org/tutorial/modules.html – 2012-08-16 07:28:27

+0

感谢RocketDonkey和Sebastian Kreft的解决方案: – 2012-08-16 07:51:07

回答

1

在usermod.py中,您需要导入main,而不是反过来。

+0

请原谅我的完全无知......我有一个main.py,其中包含我的大部分代码和从app.yaml作为该站点的着陆点调用。我想将所有的用户函数(登录,注册等)移动到一个单独的模块中,以节省main.py中的代码量...所以我将它们移动到userMod.py并将其导入到main。我没有看到或了解如何将main导入到userMod,除非我只是将导入主要添加到userMod的顶部,但是然后我将它们同时导入到两个中。当然,我错了?有没有更好的方法来构建脚本架构? – 2012-08-16 07:41:54

+1

在你的情况下,只需将Handler类移动到userMod。如果Handler类也用于其他一些模块,则需要另一个模块,并将其称为common.py或utils.py,并将其导入所有需要Handler类的模块中。 – 2012-08-16 07:48:37

+0

谢谢...这是一个更好的解决方案。 Handler将被用作所有这些的基类,因此将它放入它自己并将其导入到所有内容中将是有意义的。 – 2012-08-16 07:50:16

1

不能确定没有看到你的代码,但在这个非常基本的代码片段中,你基本上已经取消了导入。 @ IgnacioVazquez-Abrams提供了一个描述整个过程的链接(绝对比我能做的更好),但是在基本层面上,每个模块都存在于它自己的命名空间中,除非你告诉它,否则不会意识到其他模块他们。

因此,在你的情况下,当你子类Handler,该模块不知道什么Handler是因为它是1.)不是内置的,2.)尚未导入。试试这个在usermod.py

import main 

class signup(main.Handler): 
    def get(self): #some code here etc 

并看看它是否做你想要的。

+0

啊好吧......在发布之前,我已经阅读了Ignacio链接的文章,但我仍然认为导入的模块可能能够以某种方式访问​​父母班,显然不是。在我的情况下,main.py包含了大量的代码,为了访问Handler类,将它导回到这个更小的模块中似乎很奇怪。如果没有其他的方法去做,那么我会在每个需要它的模块中复制Handler类。谢谢回复。 – 2012-08-16 07:47:45

+0

你可以像'从主进口​​处理程序'那样做一些东西来拉动这个类。或者只是将所有处理程序捆绑在一个地方。 – RocketDonkey 2012-08-16 08:11:23