2012-08-08 3 views
2

Flask에서 클래스 메서드를 실행하는 데 문제가 있습니다. models/User.py에서Python 클래스 메서드가 AttributeError를 throw합니다.

:

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

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

내가 사용자 개체를 인스턴스화하지 않고 사용자 클래스를 만들 호출 할 수 없을 겁니다 : 기본 응용 프로그램 파이썬 파일에서

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 

? 파이썬 2.7.2를 사용하고 있는데 create = classmethod(create)을 사용하는 데 데코 레이팅되지 않은 구문을 시도했지만 작동하지 않았습니다. 미리 감사드립니다!

EDIT : 모델 폴더에 __init__.py 파일이 없으므로 모듈이 아니므로 from models import User이 실제로 원하는 파일을 가져 오지 못했습니다. 전에는 응용 프로그램 파이썬 스크립트와 동일한 디렉토리에 models.py 모듈을 가지고 있었기 때문에 이전에는 오류가 없었지만 삭제 후 해당 .pyc 파일을 삭제하지 않았습니다. 자, 이전에 가지고 있던 것 대신에 AttributeError: 'module' object has no attribute 'create'이라는 오류가 발생했습니다. 그러나 지금은 올바른 파일을 가져 오는 것이 확실합니다.

EDIT2 : 해결. 그런 다음 가져 오기를 from models.User import User으로 변경했습니다. 이제 메소드가 실행됩니다.

+1

'User (arg1, arg2, ...) : # constructor'이란 무엇입니까? 나는 이것이 유효한 파이썬 구문이라고 생각하지 않는다. –

+0

프로그래밍하기 전에 워드 프로세서를 읽어야합니다! –

+1

실제로 발생하는 문제점을 보여주는 최소한의 완전한 코드 샘플을 게시 해보십시오. 당신이 한 일은 프로세스에서 새로운 오류를 소개하는 코드를 바꾸어 사람들이 당신을 도울 수 없게 만들었습니다. – Duncan

답변

3

문제는 두 가지였다

  1. User.py 파일 내 수입이 실제로 더 이상 존재하지만 여전히했다 models.py 파일의 User 클래스를 찾는 것을 의미하는 models/ 폴더에 있었다 models.pyc 파일이 여전히 주위에 있었기 때문에 오류없이 가져 오기되었습니다.
  2. 가져 오기가 디렉토리 내에서 가져 오기에 잘못되었습니다. 폴더가 모듈 인 한 from models.User import User이어야 했으므로 내가해야 할 일은 모두 touch models/__init__.py이었습니다.
+2

멋진데, 이것은 정당하다. 그리고 정체 된 pyc 파일에 동일한 문제가있어서 꽤 많은 시간을 절약 해 주었다. 그리고 당신은 당신의 질문을 방어하고 당신이 이미 명백한 해결책을 보았다는 것을 명확히 밝힐 수 있습니다. – Milimetric

+1

예, "문서를 읽으십시오"는 도움이되지 않습니다. 스택 오버플로에 대해 묻지 않을 것입니다. :) –

+0

합리적인 질문, 좋은 (분명히 분명하지 않음) 대답. +1 – duozmo

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

죄송합니다. 제 질문은 꽤 잘못 작성되었습니다. 이것은 이미 완료되었지만 클래스 메소드는 여전히 작동하지 않습니다. –

+0

@OmarDiab classmethod 데코레이터를 사용하는 경우 첫 번째 인수는'cls'가 아닌'self'이어야합니다 http://docs.python.org/library/functions.html#classmethod –

+0

정말 pydocs를 읽는 것이 좋습니다. –