我遇到了在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)
的非装饰器语法,但这不起作用。提前谢谢!
__init__.py
文件,因此它不是模块,所以from models import User
实际上并没有导入我想要的文件。它之前没有给我一个错误,因为我曾经在与应用程序python脚本相同的目录中有一个models.py
模块,但在删除之后我从未删除相应的.pyc
文件。现在,我收到错误AttributeError: 'module' object has no attribute 'create'
而不是之前的错误,但我确定它现在正在导入正确的文件。
EDIT2:解决了。然后我将导入更改为from models.User import User
并且它现在正在使用该方法。
答案 0 :(得分:3)
这个问题有两个方面:
User.py
文件位于models/
文件夹中,这意味着我的导入实际上是在User
文件中查找models.py
类,该文件已不复存在但仍然存在导入时没有错误,因为models.pyc
文件仍然存在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
>>>