2014-07-10 5 views
0

파이썬 프로그래밍 책에서 OOP에 대해 배우고 있는데, 그 중 하나는 __str__() 함수를 사용하여 print() 문을 통해 속성 값을 표시하는 것입니다. 이 책은 불분명하고 내가 여기에 뭔가 큰 실종 생각 : 나는 모듈을 실행하면파이썬 __str__ 메소드 오류가 발생했습니다.

class Product: 
    def __init__(self, description, price, inventory): 
     self.__description = description 
     self.__price = price 
     self.__inventory = inventory 

    def __str__(self): 
     return '{0} - price: {1:.2f}, inventory: {2:d}'.format(self.__description(), self.__price(), self.__inventory()) 

    def get_description(self): 
     return self.__description 

    def get_price(self): 
     return self.__price 

    def get_inventory(self): 
     return self.__inventory 

이 개체를 확인하고 print() 기능을 사용을, 나는 " 'STR'객체는 다음과 같은 오류를 말한다 얻을하는 호출 할 수 없습니다. ":

>>> prod1 = Product('tomato', 1.50, 20) 
>>> print(prod1) 
Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    print(prod1) 
    File "C:/Users/person/Documents/GitHub/pyprojects/inittest.py", line 8, in __str__ 
    return '{0} - price: {1:.2f}, inventory: {2:d}'.format(self.__description(), self.__price(), self.__inventory()) 
TypeError: 'str' object is not callable 
>>> 

__str__() 기능을 어떻게 사용해야합니까? 고맙습니다.

+6

def __str__(self): return '{0} - price: {1:.2f}, inventory: {2:d}'.format(self.__description, self.__price, self.__inventory) 

을 또는 getter 메소드를 사용하지만, 당신은 실제로'self .__ description' 또는'self.get_description()'을 의미했습니다. 'self .__ price()'와'self .__ inventory()'도 동일합니다. – dano

+0

식별자 시작 부분에 '__'을 사용하지 마십시오. 이렇게하면 [private name mangling] (https://docs.python.org/2/reference/expressions.html#atom-identifiers)이 실행되며, 일반적으로 원하지 않는 일을 수행하며 '비공개'범위 지정 대신 사용할 수 없습니다. Java/C++ – msw

+0

사소한 "getters"를 쓰지 마십시오. C++/Java의 안티 패턴입니다. my_product.get_inventory() 대신'my_product.inventory'를 사용하는 것이 더 좋습니다. 다른 언어와 달리 멤버 불변량을 유지하기 위해 나중에 메서드를 추가해야하는 경우 * .inventory가 언급 된 모든 위치를 변경하지 않고 수행 할 수 있습니다. – msw

답변

3

문자열을 호출하려고합니다.

def __str__(self): 
     return '{0} - price: {1:.2f}, inventory: {2:d}'.format(self.__description(), self.__price(), self.__inventory()) 

당신이 중 하나 "()"생략해야합니다 당신은`) (`자기 .__ 설명을 사용하고

def __str__(self): 
     return '{0} - price: {1:.2f}, inventory: {2:d}'.format(self.get__description(), self.get__price(), self.get__inventory()) 
관련 문제