2016-06-20 28 views
-1

[解決方法]クラスを使用してPythonでプログラムを作成しましたが、継続して'str' 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 

はまた、私は4.5.4

+4

問題は、あなたの '__init__'方法ということです:あなたは、通常クラスにそのインスタンスにstr()を呼び出すか、直接print()機能に送信し印刷し、ユーザーフレンドリーな文字列を生成することができます__str__方法を与えるだろう'color'インスタンス属性を持つ' color'メソッドをシャドウイングしています。インスタンス属性に '_color'のようなものを使用することをお勧めします。先頭のアンダースコアは、オブジェクトのプライベート属性に使用される規則です。 – Bakuriu

+0

ところで、あなたの問題は何もしませんが、 'print'はあなたのために文字列化します:' print( "Lamborghiniのモデル番号は" self.model_number ")' – cdarke

+0

@cdarke:Python 3または '__future__インポートprint_function'。文字列の '(...)'がPython 2の 'print'文でうまく動作することを考慮してください。 –

答えて

1

あなたのメソッドや属性が同じ名前を持つPyCharmのコミュニティ版を使用しています。

+0

ありがとうございます:) –

3

color(など)は、変数名(文字列)とメソッド名の両方として使用しています。あなたはPythonでそれを行うことはできません。

エラーは、文字列変数の後ろにカッコを入れていることを意味します(したがって、関数のように「呼び出し」しようとしています)。これを見ると、プログラミングロジックにエラーがあります。

3

あなたのインスタンスは以下の属性があります:あなたが定義されて

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

これらマスク方法を。方法は、単により多くの属性ですが、Pythonは、属性を見つけるために、クラスで唯一の最初のインスタンスを見て、:

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

あなたは文字列'Red'を呼び出そうとしている、Lambo.color()メソッドを呼び出していません。 __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) 
関連する問題