2012-11-22 6 views
0

ndb.Model (Google App Engine 것)에서 상속 한 객체가 있습니다. 이 개체는 속성이라고 commentid 있습니다파이썬 속성이 작동하지 않습니다.

class Comment(ndb.Model): 
    commentid = ndb.StringProperty() 

기사의 무리 읽기를, 모두는이 속성 구현하는 방법입니다 말 :

@property 
def commentid(self): 
    if not self._commentid: 
     self._commentid = "1" 
    return self._commentid 

을하지만 난 Comment object has no attribute _commentid 말하는 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집 : 분명히 여기서 약간 혼란 스럽네요. Objective-C에서 왔는데, x이라는 속성이 있으면 getters와 setter에 _x이라는 변수가 자동으로 생깁니다. 그래서 나는 이것이 파이썬에서도 일어난다 고 생각했다. 하지만 분명히 밑줄 접두사가있는 변수의 값을 수동으로 설정해야합니다.

필자가 원하는 것은 값을 반환하기 전에 값을 확인하는 getter를 구현하는 것입니다. 어떻게하면 좋을까요?

+0

한 번만 authorID를 언급하고 다시 표시되지 않습니다. –

+0

@PaulC은 주석으로 작성되었습니다 – Snowman

+0

전체 수업입니까? – Michael0x2a

답변

5

그 개체에 대한 속성을 정의 할 필요 같은 속성을 구현. 거기서 뭐하는거야, 코멘트라는 클래스를 정의하고 있지만 당신은 그 클래스에 대해 정의 할 개체의 속성을 정의하지 않습니다.

나 작은 예제를 보여 보자 : 위의 예에서

class ExampleClass: 
    name = "Example Object" 

a = ExampleClass() # Init new instance of ExampleClass 
print(a.name) # a doesn't own an attribute called "name" 
print(ExampleClass.name) # --> "Example Object" 

을, 나는 클래스 ExampleClass를 정의하고 그것을 값 Example Object의 변수 name을 제공합니다. 그 후에 객체 a = ExampleClass()을 만들지 만 name 속성을 얻지 못합니다. 속성이 객체 자체가 아니라 클래스 자체에 정의되어 있기 때문입니다.

이 문제를 해결하려면 __init__ -method 안에 이름을 정의합니다.이 메서드는 해당 클래스의 개체가 만들어 질 때마다 호출됩니다.

class ExampleClass: 
    def __init__(self): 
     self.name = "Example Class" 

a = ExampleClass() # Init new instance of ExampleClass 
print(a.name) # --> "Example Class" 
print(ExampleClass.name) # --> ERROR: Exampleclass.name doesn't exist 

이 나는 ​​다시 ExampleClass를 정의하지만 나는 또한 그것을 위해 __init__ 방법을 정의합니다. Init 메서드는 하나의 매개 변수 인 self만을 사용하며이 매개 변수는 자동으로 함수에 전달됩니다. 그것은 창조되고있는 대상입니다. 그런 다음 self.name = "Example Class"을 설정하고 self는 객체 자체이므로 객체의 속성 name을 설정합니다.

이 속성에 대한 세터와 게터를 구현하려면 속성을 만들기

다음을 추가합니다

class ExampleClass: 
    def __init__(self): 
     self.name = "Example Class" 

    @property 
    def name(self): 
     if not self._name: 
      pass #blabla code here 
     return self._name 

    @name.setter 
    def name(self, value): 
     #blabla more code 
     self._name = value 

또한, 당신이 너무 매개 변수로 name을 취할 수있는 __init__ 방법을 편집해야합니다.

def __init__(self, name="Example Object"): 
    self.name = name 

+0

잠깐, init 메소드에서 수동으로 할당하지 않았다면 여기서 self._name에 어떻게 접근하고 있습니까? – Snowman

+0

저는 접두사 변수 밑줄에 대해 구체적으로 말하고 있습니다. – Snowman

+0

init에서'self.name = "Example Class"를 호출하면 "Example class"매개 변수로 자동으로'@ name.setter' 함수가 호출됩니다. setter 내부에서'self._name = "Example Class"를 설정했다. init을 변경하여'self.name' 대신에'self._name'을 설정할 수 있습니다. setter를 호출 할 것인지 아니면 변수를 설정 할 것인지에 따라 다릅니다. –

2

self._commentid에 직접 액세스하는 경우 정의해야합니다. 그렇지 않으면 예외가 발생합니다. 대신 _commentid 모두에 정의 된 경우 확인하고 있기 때문에 내가 hasattr를 사용하는 것, (그것을 디폴트 값을 제공하기 위해) :

@property 
def commentid(self): 
    if not hasattr(self, "_commentid"): 
     self._commentid = "1" 
    return self._commentid 
+0

파이썬은 _varName에 속성을 자동으로 부여하지 않습니까? – Snowman

+0

@mohabitar : 아니요.이 작업을 쉽게하기 위해 클래스에 '없음'을 지정할 수 있습니다. –

관련 문제