Python类方法抛出AttributeError

时间:2012-08-08 09:14:55

标签: python exception flask class-method attributeerror

我遇到了在Flask中运行类方法的问题。

models/User.py

from mongoengine import *

class User(Document):
  first_name = StringField()
  last_name = StringField()
  ...

  def __init__(self, arg1, arg2, ...):
    self.first_name = arg1
    self.last_name = arg2
    ...

  @classmethod
  def create(self, arg1, arg2, ...):
    #do some things like salting and hashing passwords...
    user = self(arg1, arg2, ...)
    user.save()
    return user

在主应用程序python文件中:

from models import User
...
def func():
  ...

  #Throws "AttributeError: type object 'User' has no attribute 'create'"
  user = User.create(arg1, arg2, ...) 

我不能在没有实例化User对象的情况下在User类上调用create吗?我正在使用Python 2.7.2,我也尝试了使用create = classmethod(create)的非装饰器语法,但这不起作用。提前谢谢!

编辑:我发现了一个问题:models文件夹中没有__init__.py文件,因此它不是模块,所以from models import User实际上并没有导入我想要的文件。它之前没有给我一个错误,因为我曾经在与应用程序python脚本相同的目录中有一个models.py模块,但在删除之后我从未删除相应的.pyc文件。现在,我收到错误AttributeError: 'module' object has no attribute 'create'而不是之前的错误,但我确定它现在正在导入正确的文件。

EDIT2:解决了。然后我将导入更改为from models.User import User并且它现在正在使用该方法。

2 个答案:

答案 0 :(得分:3)

这个问题有两个方面:

  1. User.py文件位于models/文件夹中,这意味着我的导入实际上是在User文件中查找models.py类,该文件已不复存在但仍然存在导入时没有错误,因为models.pyc文件仍然存在
  2. 导入在目录中导入不正确。它应该是from models.User import User,只要models/文件夹是一个模块,那么我需要做的就是touch models/__init__.py

答案 1 :(得分:1)

>>> class foo(object):
...     def __init__(self):
...             pass
...     @classmethod
...     def classmethod(cls):
...             return 0
...
>>> a = foo()
>>> a.classmethod()
0
>>>