2016-03-21 3 views
1

私は.NETとJavascriptのバックグラウンドから来て、私はPython(Raspberry Pi用)を学ぶために自分のやり方を工夫しています。
今、私はPythonでOOPを理解しようとしており、メソッドとクラスを使用しています。しかし、@staticmethodに少し問題があります@staticmethod属性のないメソッドの中でprint()を実行することはできますか?

class Car(object): 
    """description of class""" 

    def __init__(self, make, model): 
     self.make = make 
     self.model = model 

    @staticmethod 
    def makeFirstNoise(): 
     print("Vrooooommm!") 

    def makeSecondNoise(): 
     print("Mweeeeeeeeeh!") 

これは私のクラスを実装し、両方の方法を実行しようとしています。

from Car import Car 

mustang = Car('Ford', 'Mustang') 
mustang.makeFirstNoise() 
mustang.makeSecondNoise() 

これが出力されます。

Vrooooommm! Traceback (most recent call last): File "D:\Dev\T\PythonHelloWorld\PythonHelloWorld\PythonHelloWorld.py", line 5, in <module> mustang.makeSecondNoise() TypeError: makeSecondNoise() takes 0 positional arguments but 1 was given

そこで問題は、なぜ私は私のstaticmethod属性なしで第二の方法を実行することはできませんか?それはstaticmethodとして宣言されていないので、それが自動的に、一つの引数、selfを渡されるため

def makeSecondNoise(): 
    return "Mweeeeeeeh!" 

print(mustang.makeSecondNoise()) 

答えて

1

makeSecondNoiseは、エラーの原因となっている理由は次のとおりです。これは、私はちょうどこのように直接テキストを返す場合は動作するようです。 selfは、関数が呼び出されたクラスのインスタンスです。 makeSecondNoiseはパラメータを受け入れるようにコード化されていないため、最終的にはこのエラーが発生します。それは、これを行うようになるだろう:(私は仕事にprintせずに、あなたの例を得ることができなかったあなたの問題はprintに関連していない

>>> class Car: 
...  def makenoise(self): 
...   print(self) 
... 
>>> mustang = Car() 
>>> mustang.makenoise() 
<__main__.Car object at 0x0000000005498B38> # We can see that "self" is a reference to "mustang" 

def something(): 
    ... 
something("Foo") 

ここではどのようself作品の例ですどちらか) - それはself引数の自動渡しに関連しています。

1

Pythonでは、(classmethodsとstaticmethods以外の)すべてのメソッド呼び出しは、最初の引数としてオブジェクトインスタンスを明示的に渡しました。条約はこの引数の名前をselfとすることです。この明示的な引数は、メソッドのシグネチャに含める必要があります。

class Car(object): 
    def makeSecondNoise(self): # note that method takes one argument 
     print("Mweeeeeeeeeh!") 

その後、問題なく呼び出すことができます。 Javaの、this

mustang = Car('Ford', 'Mustang') 
mustang.makeSecondNoise() 

(インスタンスオブジェクトを表す)メソッドに暗黙的に渡される - これはあなたの混乱の源です。

関連する問題