2017-12-03 11 views
2

私はpython(C++の世界から来て)に慣れていて、クラスメソッドを試していました。私は引数なしでメソッドを作成しました(意図的にこの場合はself引数を避けています)。それから私は、私はPythonでは、と呼ばれるすべてのクラスのメソッドは、常にそのオブジェクトの参照である少なくとも一つの引数を渡され、ため、このエラーがあると思い呼び出すpythonクラスのメソッドがありません

class car: 

    def car_method(): 
     print("Inside Car method") 


obj = car_method() 
obj.car_method() <---- this creates error: TypeError: car_method() takes 0 positional arguments but 1 was given 

それを呼び出そうとしました。私は正しいですか?

その後さらに実験する、私は

obj.car_method  <----- assuming I am not passing any argument to it 

を書きましたが、機能は何も印刷されません。

は、それから私は、誰もがここで何が起こっているか説明でき

bound method car.car_method of <__main__.car object at 0x005D2290>

が生じ

print(obj.car_method)

を使用して、それのタイプを印刷しようとしました。 car_methodはどのように呼び出すのですか? car_methodを呼び出す方法がない場合、なぜPythonでは引数を指定せずにメソッドを定義できますか?

ここでは基本についてよく理解しようとしています。 car_methodをクラスメソッドとして呼び出すことはできますか?それとも、クラス内で定義されたメソッドですか?クラスのメソッドは次のようにすることによって定義されるPythonで

+0

を@classmethodと@staticmethodデコレータについての詳細を知るためにはPythonの

で、実行時に起こりますクラスメソッド?それはクラス内で定義されたメソッドなのでしょうか?」と、私はそれが違う振る舞いをしていることを実感しました。さらに実験した後、クラス内で使用できるクラスメソッドですが、 'self.car_method ) '。これでもエラーが発生します。しかし、 'car_method()'のように呼び出すと、他のクラスメソッドで使用しないとうまくいくでしょう!!!!それはクラス属性として使用することができます! – legameeternoforall

答えて

0

class MyObj(object): 

    def my_method(self): 
     pass 

常に少なくとも1つのインスタンス自体である最初の引数。

2

Pythonでは、クラスのすべてのメソッドは、最初の引数として暗黙的にクラスオブジェクトのインスタンスを受け取ります。

Pythonでは、クラスメソッドの最初の引数をselfと指定するのは、C言語ではJavaのような言語のthisです。唯一の違いは、予約語ではなく、名前を付けることができます。 selfを使用するのが一般的な慣習ですが、PythonプログラマーやPythonのドキュメント、IDEパーサーには読みやすくなります。 Read the docs

selfを使用して、クラスのメソッド間でクラスメソッドと変数にアクセスできます。あなたがclassmethodをしたい場合

In [37]: class car: 
    ...:  def __init__(self): 
    ...:   self.car_name = 'Jaguar' 
    ...: 
    ...:  def car_method(self): 
    ...:   print("I can access " + self.car_name + " because I have 
    ...: self") 
    ...:   print("Inside Car method") 
    ...: 
    ...:  def another_method(self): 
    ...:   # this calls car_method 
    ...:   self.car_method() 
    ...: 

In [38]: c = car() 

In [39]: c.another_method() 
I can access Jaguar because I have self 
Inside Car method 

:自己のユースケースを示す非常に簡単な例。

class car: 

    @classmethod 
    def car_method(cls): 
     print("Inside Car method") 

car_method方法の上に小さな事@classmethodはPythonでdecoratorと呼ばれている:あなたはとPythonでクラスメソッドを定義することができます。しかし、クラスメソッドでも、クラスインスタンスはcar_methodの引数として渡されます。

引数なしでメソッドcar_methodを呼び出す場合は、クラス/インスタンス変数にアクセスする必要はありません(静的メソッドと呼ばれます)。メソッドを@staticmethodデコレータで静的メソッドとして定義することができます。

class car: 

    @staticmethod 
    def car_method(): 
     print("Inside Car method") 

ここで何selfは、引数として渡されていないと自己が引数として渡された場合でも、Pythonがcar_methodを作成することを可能にするなぜあなたはcar().car_method()

としてcar_method呼び出すことができますか?

これはPythonがCのように静的に型付けされていないためです。これは動的言語です。私もようcar_method呼び出すことができます静的型付け言語とは異なり、すべてのタイプ、関数の引数は、などのチェックは `最後の文章を書いている間、read about @classmethod and @staticmethod in this awesome SO thread

+0

応答のためにありがとう、あなたが言及した 'classmethod'と 'staticmethod'がありますが、私はそれらのどちらかではないクラス内のメソッドは何か知りたかったのですか?どのように動作するのですか?私は投稿を投稿した後にコメントを追加したので、コメントしてください。私はこれを知って好奇心が強いです! – legameeternoforall

+0

@legameeternoforall答えに例を追加しました。あなたが添付した文書を読むことをお勧めします。これは、PythonでOOPについて非常に良いスタートを与えます。 –

+0

@legameeternoforallあなたが役に立ったと思ったら、[私の答えを受け入れる](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を自由に感じてください。 :-) –

関連する問題