2016-06-20 2 views
-1

[해결] 클래스를 사용하여 Python으로 프로그램을 만들었지 만 계속해서 'str' object is not callable을 말하고 있습니다. 7,8 및 16 행을 주석 처리하려고하면 'int' object is not callable이 표시됩니다.str이 호출 할 수 없거나 int를 호출 할 수 없습니다.

class Lambo: 
    def __init__(self, color, model_number, average, milage): 
     self.color = color 
     self.model_number = model_number 
     self.average = average 
     self.milage = milage 
    def color(self): 
     print("Lamborghini color is " + self.color) 
    def model_number(self): 
     print("Lamborghini model number is " + str(self.model_number)) 
    def average(self): 
     print("Lamborghini average is " + str(self.average)) 
    def milage(self): 
     print("Lamborghini milage is " + str(self.milage)) 
lambor = Lambo("Red", 2016, 20, 8) 
lambor.color() 
lambor.model_number() 
lambor.average() 
lambor.milage() 

예상 출력 :

Lamborghini color is Red 
Lamborghini model_number is 2016 
Lamborghini average is 20 
Lamborghini milage is 8 

또한 내가 PyCharm 커뮤니티 에디션을 사용하고 4.5.4

+4

문제는 당신'__init__' 방법이다 : 당신은 일반적으로 클래스를 다음 인스턴스에 str() 전화를하거나 직접 print() 기능에 보내 인쇄, 사용자 친화적 인 문자열을 생성 할 수있는 __str__ 방법을 줘야 할 것 'color' 인스턴스 속성을 가진'color' 메쏘드가 * shadowing *됩니다. 나는 당신이 인스턴스 속성을 위해'_color'와 같은 것을 사용할 것을 제안한다. 맨 앞에있는 밑줄은 개체의 개인 특성에 사용되는 규칙입니다. – Bakuriu

+0

그건 그렇고, 당신의 문제와 관련이 없지만'print'는 당신을 위해 다음과 같이 문자열을 사용합니다 :'print ("Lamborghini model number is, self.model_number)' – cdarke

+0

@cdarke : 오직 파이썬 3이나'from __future__ 가져 오기 print_function'. 문자열 주위의'(...)'이 파이썬 2에서'print' 문에 대해 잘 작동한다는 점을 고려하십시오. –

답변

1

귀하의 방법과 속성이 같은 이름을 가지고있다.

+0

감사합니다 모두들 :) –

3

변수 이름 (문자열)과 메소드 이름으로 color (등)을 사용하고 있습니다. 파이썬에서는 그렇게 할 수 없습니다.

오류 str is not callable은 문자열 변수 뒤에 괄호를 넣음으로써 함수처럼 "호출"하려고한다는 것을 의미합니다. 이것을 볼 때마다 프로그래밍 논리에 오류가 있습니다.

3

인스턴스는 다음과 같은 속성이 있습니다 : 사용자가 정의한

self.color = color 
self.model_number = model_number 
self.average = average 
self.milage = milage 

마스크 방법을; 방법은 더 속성이지만, 파이썬은 속성을 찾을 수있는 클래스에만 먼저 인스턴스에서보고, : 당신은 Lambo.color() 메소드를 호출하지 않는

>>> lambor = Lambo("Red", 2016, 20, 8) 
>>> lambor.color 
'Red' 

, 당신은 문자열 'Red'를 호출하려고합니다. __init__에 설정 한 특성의 이름을 바꾸거나 메서드의 이름을 바꿉니다. 당신은 선두를 사용할 수

는 충돌을 제거하고 속성 만 클래스에서 내부적으로 사용되는 것을 문서화 모두에 각각의 이름에 밑줄 :

또는
class Lambo: 
    def __init__(self, color, model_number, average, milage): 
     self._color = color 
     self._model_number = model_number 
     self._average = average 
     self._milage = milage 
    def color(self): 
     print("Lamborghini color is " + self._color) 
    def model_number(self): 
     print("Lamborghini model number is " + str(self._model_number)) 
    def average(self): 
     print("Lamborghini average is " + str(self._average)) 
    def milage(self): 
     print("Lamborghini milage is " + str(self._milage)) 

, 어떤 상태로 방법의 이름을 변경 그것을 하고있다; print_로 접두사 :

일반적으로
class Lambo: 
    def __init__(self, color, model_number, average, milage): 
     self.color = color 
     self.model_number = model_number 
     self.average = average 
     self.milage = milage 
    def print_color(self): 
     print("Lamborghini color is " + self.color) 
    def print_model_number(self): 
     print("Lamborghini model number is " + str(self.model_number)) 
    def print_average(self): 
     print("Lamborghini average is " + str(self.average)) 
    def print_milage(self): 
     print("Lamborghini milage is " + str(self.milage)) 

lambor = Lambo("Red", 2016, 20, 8) 
lambor.print_color() 
lambor.print_model_number() 
lambor.print_average() 
lambor.print_milage() 

말하기,이 같은 출력을위한 클래스가 책임을해서는 안됩니다.

class Lambo: 
    def __init__(self, color, model_number, average, milage): 
     self.color = color 
     self.model_number = model_number 
     self.average = average 
     self.milage = milage 
    def __str__(self): 
     lines = [ 
      "Lamborghini color is " + self.color, 
      "Lamborghini model number is " + str(self.model_number), 
      "Lamborghini average is " + str(self.average),    
      "Lamborghini milage is " + str(self.milage) 
     ] 
     return '\n'.join(lines) 

lambor = Lambo("Red", 2016, 20, 8) 
print(lambor) 
관련 문제