2013-05-19 25 views
0

我有以下代码:的Python:从类中调用模块的功能

from suchandsuch import bot 

class LaLaLa(): 
    def __init__(self): 
     self.donenow = 0 
     print "LaLaLa() initialized." 
     return 

    def start(self): 
     pages = bot.cats_recursive('something') 
     for page in pages: 
      self.process_page(page) 

当我尝试运行y = LaLaLa(),然后y.start(),虽然,我得到一个错误:

AttributeError: LaLaLa instance has no attribute 'cats_recursive' 

这让我怀疑Python试图从suchandsuch的bot子模块中调用cats_recursive()而不是(正如在文件的开头定义的那样),而是从LaLaLa()中调用cats_recursive(),但当然没有cats_recursive )好玩ction。有没有办法强制类实例使用导入的模块,而不是只看内部?

+0

不应该有任何问题与此代码。你的真实代码可能会做一些不同的事情......你可以发布它吗? –

回答

1

海报是正确的,没有错你已发布的代码。

这是您的代码没有后可能是问题。它暗示在你的cats_recursive命名中。你没有告诉我们,LaLaLa可以在bot.py中定义或导入。

一来复制你的错误的方法是:

# in suchandsuch/bot.py 

class LaLaLa(): 
    def __init__(self): 
     self.donenow = 0 
     print "LaLaLa() initialized." 
     # don't need a `return` here 

def start(self): 
    pages = bot.cats_recursive('something') 
    for page in pages: 
     self.process_page(page) 

bot = LaLaLa() 

这只是其中一个。另一种是有__init__.py如此这般类似:

bot = LaLaLa() 

就像我说的,错误是在你的代码结构。

打印内部LALALA或captrue与pydb错误的机器人的ID,我怀疑你会看到机器人是除Y以外LALALA的一个实例(再次检查的ID)

+0

错误在于我已将LaLaLa()的实例设置为名为bot的变量 - 完全如您所示!非常感谢。 – tehsockz

1

你很好。 最有可能在你的模块中没有cats_recursive()属性是真实的。检查语法,检查模块内容。

+0

那么,这个消息确实指向一个'LaLaLa'实例。这意味着'suchandsuch'中有另一个名为'LaLaLa'的类(定义或使用)。 – delnan

1

您可能会发现最简单的方法是尝试将cats_recursive()分配给pages变量以外的类,然后将该变量作为参数传递给start()函数。如果这有效,那么保持这种方式,如果它不起作用,那么其他地方的代码可能有问题。