2017-01-28 5 views
3

私はPythonを学んでおり、私はカードゲームをシミュレートしようとしています。 ドット表記に関する質問があります。私はインターネット上で特定の答えを探しましたが、見つけられませんでした。Pythonのドット表記法。オブジェクトの前後にメソッドを配置する必要がありますか?

なぜそれが、時には我々はこのようなドット表記でメソッドを呼び出すために教えられていることを、次のとおりです。

object.methodName() 

我々はこのようにそれを呼び出すことが示されている他の回中:

className.methodName(object) 

何違いは何ですか?

具体例を示します。これは本からのメソッドの定義である(コンピュータ・サイエンティストのように考える方法)

class Hand(Deck): 
    def __init__ (self, name = " "): 
     self.cards = [] 
     self.name = name 

    def __str__(self): 
     s = "Hand "+ self.name 
     if self.isEmpty(): 
      return s+" is empty\n" 
     else: 
      return s+ " contains\n" + Deck.__str__(self) 

時にはオブジェクトはメソッドの前に来る:

self.isEmpty() 

時にはオブジェクトが括弧内に、メソッドの後に来ます:

Deck.__str__(self) 

どの方法を使用しますか?それは問題ですか?

+2

'Deck'は*クラス*で、' Deck .__ str__'はアンバインドされたメソッドです。代わりに 'self .__ str __()'を試した場合は、 'Hand .__ str __()'メソッドをもう一度呼び出すと(無限の再帰エラーが発生します)、親クラスが必要なので明示的に呼び出されます。 –

+2

しかし、そのようなクラスを呼び出すことはお勧めできません。代わりに 'super().__ str __()'を使います(親クラスが何であるかを 'super()'にし、 'Deck .__ str__'を' self'に正しく見つける方法)。 –

+1

'Hand'サブクラスで' __str__'メソッドをオーバーライドするので、親バージョンの '__str__'を呼び出す必要があります。前述のように、より複雑な継承構造を扱うので、代わりに 'super().__ str __()'を実行する必要があります。 – tdelaney

答えて

1

Sometimes the object comes after the method, in the parenthesis:

Deck.__str__(self) 

いいえ、オブジェクトは、常に独自のメソッドの前に来ます。この行には2つのpython "オブジェクト"があります。 selfオブジェクト(実際にはクラスインスタンス)を、Deckオブジェクト(実際にはクラス)の__str__メソッドへのパラメータとして渡しています。

1

Wennあなたが使用します。

object.methodName() 

その後、あなたはそれ自身のデータを特殊なインスタンスのメソッドを呼び出します。 メソッドが特定のインスタンスに関連しているため、異なる結果が得られます。

a = Hand() 
b = Hand() 

次いで

a.cards 
b.cards 

は(ほとんどの場合)、異なっていてもよいです。

このデータにアクセスするには、オブジェクトselfがすべてのメソッドに配置されている必要があります。

def foo(self): 
    return self.cards 

このメソッドを定義すると、次のようになります。

特別なクラスのメソッドを記述しない限り、常に自分自身を置く必要があります。

object.methodName()を呼び出すと、オブジェクト/インスタンス参照をドットの前に渡すため、このメソッドは自動的にオブジェクトの情報を取得します。この情報はパラメータselfに格納されます。例えば、return self.cards

のように呼び出すと、これはクラスを持つよりも、self(オブジェクト参照自体)がないことを意味します。

だから、したがって、この方法は、あなたがselfを引き渡すする必要があり、それが属するインスタンスデータを知りません。

object.__str__()を呼び出すと、メソッドの呼び出しにオブジェクト参照を使用したため、インスタンスに関する情報が表示されます。

しかし、あなたはDeck RESPを使用している場合。 classNameの場合は、className.method(self)経由でインスタンスに関する情報を入力する必要があります。そうしないと、オブジェクトインスタンスのオブジェクト参照が存在しないためです。

私はこの説明が理解を願っています。

0

一般的に、オブジェクトが最初に来ます。このよう

object.methodName()

またはこのような

self.isEmpty()

しかし、私は私のPythonの本は、このように、この1つのメソッドを呼び出すように私に教えている理由を知りたいと思った:

Deck.__str__(self)

私は、メソッドの冒頭ではなく、最後に括弧内に「自己」がある理由を知りたかったのです。言い換えれば、なぜこのようにそれを記述しない:これを書かれたので、上記のエラーが発生した

"Hand instance has no attribute Deck

self.Deck._str_()

理由は、上記のコードはエラーをスローだろうということですPythonは "Deck"は自己の属性だと考えています。しかし、この場合はそうではありません。 DeckはHand型のPARENT型であり、selfの属性ではありません。ここで

は、あなたが問題のコードだけでなく、親のタイプ(デッキ)と私は(ハンド)で働いていた子の種類を見ることができるコードブロックです。このコードでは、Deckの文字列フォーマットにアクセスして、Handの文字列書式を上書きするメソッドを作成しています。コードスニペットDeck.__str__(self) はこのように書かれています。なぜなら、Pythonに文字列の書式をコピーするタイプオブジェクトを伝える方法が必要なためです。この例では、親のDeckから文字列の書式設定が必要でした。

class Hand(Deck): def __init__ (self, name = " "): self.cards = [] self.name = name

def __str__(self): 
    s = "Hand "+ self.name 
    if self.isEmpty(): 
     return s+" is empty\n" 
    else: 
     return s+ " contains\n" + Deck.__str__(self) 

はまた、@マルタインピータースで述べたように、SUPER使用:super().__str__()はそれを私がやった方法を行うよりも優れている:Deck.__str__(self) 我々はまだスーパーを学んでいないが、あなたはについての詳細を学ぶことができますそれはここにある(https://docs.python.org/2/library/functions.html#super)。Superは基本的にPythonにあなたのための親フォーマットを見つけ出し、それを使用します。ずっと簡単!

この説明が理解できることを願っています。 -/

関連する問題