2016-08-26 13 views
1

私は9.3.2を読んでいます。クラスオブジェクトをPythonのドキュメントから入手して、誰かが以下をクリアできることを望んでいました:Pythonでは、自己と同じ型のオブジェクトが必要ですか?

どのようにして両方のシナリオが 'hello world'に戻りますか?自分自身が「MyClass」というオブジェクトを参照しているため、私は2番目のインスタンスで自分自身に「m」を渡しても同じことをしていると思いますので、私は一種の理解しています(少なくとも私はそう信じています)。関数 'self'は 'MyClass'オブジェクトへの参照を必要としますか?

>>> class MyClass: 
...  """A simple example class""" 
...  i = 12345 
...  def f(self): 
...   return 'hello world' 
... 
>>> MyClass.f(MyClass) 
'hello world' 
>>> m = MyClass() 
>>> MyClass.f(m) 
'hello world' 
+1

は 'self'はただの引数で、何が、そこにソースクラスのインスタンスだけではないに合格することができます。それはちょうど通常それを行うには意味がありません。 –

+0

何らかの理由で私は「自己」について独特の何かがあると思った。あなたがその単なる議論を言うとき、それは理にかなっています。それは何でもかかります。 – jes516

答えて

3

Pythonはある限り、それは正しいインターフェースを提供して、何であるかタイプself問題ではないという意味、「アヒル型指定された」です。ここでは、selfは関数の本体では使用されていないので、のいずれかをからMyClass.fに渡しても問題ありません。最初のインスタンスで

>>> MyClass.f(None) 
'hello world' 
>>> MyClass.f(9) 
'hello world' 
>>> MyClass.f("foo") 
'hello world' 
+1

これは、Python 3.XのPython 2.Xでのみ有効です。TypeError:バインドされていないメソッドf()は、最初の引数としてMyClassインスタンスで呼び出されなければなりません。 –

+0

; MyClassは明示的な親クラスを持たなかったので、私はPython 3を前提としていました。 – chepner

+0

あなたの権利は、実際にはPython 3です。そうでなければ、 'MyClass.f(MyClass) 'という行はエラーを発生させます。 –

0
MyClass.f('what the...') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-2-cca57c03fecc> in <module>() 
----> 1 MyClass.f('what the...') 

TypeError: unbound method f() must be called with MyClass instance as first argument (got str instance instead) 

mc = MyClass() 

mc.f('what?') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-bcd3830312d3> in <module>() 
----> 1 mc.f('what?') 

TypeError: f() takes exactly 1 argument (2 given) 

、関数は、最初の引数としてMyClassのインスタンスを必要とします。 2番目の例では、インスタンスが暗黙的に渡されます。したがって、文字列引数What?は、予期しない関数の第2引数です。あなたが望むことは何

class MyClass: 
    @staticmethod 
    def f(): 
     print('hello world') 

>>> MyClass.f() 
hello world 

mc = MyClass() 
>>> mc.f() 
hello world 
+1

これはPython 2.Xにのみ当てはまります。最初の例は、Python 3.Xで問題なく動作します( 'TypeError'はありません)。 –

関連する問題