4

我在获取类方法以在 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,并且我还尝试了 using 的非装饰器语法create = classmethod(create),但这不起作用。提前致谢!

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

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

4

2 回答 2

3

这个问题是双重的:

  1. User.py文件在models/文件夹中,这意味着我的导入实际上是在文件中寻找User类,该类models.py不再存在但仍然被导入而没有错误,因为该models.pyc文件仍然存在
  2. 在目录中导入时导入不正确。它应该是from models.User import User,只要models/文件夹是一个模块,所以我需要做的就是touch models/__init__.py
于 2012-08-10T08:45:25.100 回答
1
>>> class foo(object):
...     def __init__(self):
...             pass
...     @classmethod
...     def classmethod(cls):
...             return 0
...
>>> a = foo()
>>> a.classmethod()
0
>>>
于 2012-08-08T09:20:00.873 回答