unboundメソッドf()は、最初の引数としてfibo_インスタンスを使用して呼び出す必要があります(代わりにclassobjインスタンスを取得)


139

Pythonでは、クラスでメソッドを実行しようとするとエラーが発生します。

Traceback (most recent call last):
  File "C:\Users\domenico\Desktop\py\main.py", line 8, in <module>
    fibo.f()
  TypeError: unbound method f() must be called with fibo instance 
  as first argument (got nothing instead)

コード:(swineflu.py)

class fibo:
    a=0
    b=0

    def f(self,a=0):
        print fibo.b+a
        b=a;
        return self(a+1)

スクリプトmain.py

import swineflu

f = swineflu
fibo = f.fibo

fibo.f()            #TypeError is thrown here

このエラーはどういう意味ですか?このエラーの原因は何ですか?


1
オブジェクトをインスタンス化しますか?
トーマス

2
クラス名は大文字にする必要があります。
CDT 2013

1
fibo = f.fibo()括弧でクラスをインスタンス化する必要があります。
Kotlinboy、2018

使用できますfibo().f()
Benyamin Jafari 2018年

回答:


179

まず、モジュールへの参照を別の名前にする必要はありません。(からのimport)参照がすでにあり、そのまま使用できます。別の名前が必要な場合は、を使用してくださいimport swineflu as f

次に、クラスをインスタンス化するのではなく、クラスへの参照を取得します。

したがって、これは次のようになります。

import swineflu

fibo = swineflu.fibo()  # get an instance of the class
fibo.f()                # call the method f of the instance

バインドされた方法は、オブジェクトのインスタンスに取り付けられているものです。未結合の方法は、もちろんされるものではないインスタンスに取り付けられています。エラーは通常、インスタンスではなくクラスでメソッドを呼び出していることを意味します。これは、クラスをインスタンス化していなかったため、この場合に起こっていたことです。


1
swineflu.fibo().f()1度だけ呼び出す場合にも実行できます。
キット

81

このエラーをできるだけ少ない行で再現する方法:

>>> class C:
...   def f(self):
...     print "hi"
...
>>> C.f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with C instance as 
first argument (got nothing instead)

最初にクラスをインスタンス化しなかったためTypeErrorのために失敗します。2つの選択肢があります。1つはメソッドを静的にして静的な方法で実行できるようにするか、2:クラスをインスタンス化してインスタンスを取得します。上で、メソッドを実行します。

メソッドを静的な方法で実行したいようですが、次のようにします。

>>> class C:
...   @staticmethod
...   def f():
...     print "hi"
...
>>> C.f()
hi

または、おそらく、次のようにインスタンス化されたインスタンスを使用することを意味します。

>>> class C:
...   def f(self):
...     print "hi"
...
>>> c1 = C()
>>> c1.f()
hi
>>> C().f()
hi

これで混乱する場合は、次の質問をしてください。

  1. 静的メソッドの動作と通常のメソッドの動作の違いは何ですか?
  2. クラスをインスタンス化するとはどういう意味ですか?
  3. 静的メソッドの実行方法と通常のメソッドの違い。
  4. クラスとオブジェクトの違い。

クラスをインスタンス化しましたが、@ staticmethodを使用した場合にのみ機能します。説明できますか?
abeltre1 2017

9

fibo = f.fiboクラス自体を参照します。あなたはおそらくfibo = f.fibo()(括弧に注意して)クラスのインスタンスを作成したいと思ったでしょう、その後fibo.f()正しく成功するはずです。

f.fibo.f()あなたは本質的f(self, a=0)に供給せずに呼び出しているので失敗しselfます; selfクラスのインスタンスがあると、自動的に「バインド」されます。


4

f(インスタンス)メソッドです。ただし、それはfibo.f。ここで、fiboクラスオブジェクトです。したがって、fはバインドされていません(どのクラスインスタンスにもバインドされていません)。

あなたがしたなら

a = fibo()
a.f()

その後、それfは(インスタンスにa)バインドされます。


2
import swineflu

x = swineflu.fibo()   # create an object `x` of class `fibo`, an instance of the class
x.f()                 # call the method `f()`, bound to `x`. 

Pythonのクラスを使い始めるのに適したチュートリアルを次に示します。


2

Python 2では(3には異なる構文があります):

メソッドの1つを呼び出す必要がある前にParentクラスをインスタンス化できない場合はどうなりますか?

super(ChildClass, self).method()親メソッドにアクセスするために使用します。

class ParentClass(object):
    def method_to_call(self, arg_1):
        print arg_1

class ChildClass(ParentClass):
    def do_thing(self):
        super(ChildClass, self).method_to_call('my arg')

0

Python 2と3バージョンの違い:

同じ名前のクラスにデフォルトのメソッドがすでにあり、同じ名前で再宣言した場合、インスタンス化したいときに、そのクラスインスタンスのunbound-method呼び出しとして表示されます。

クラスメソッドが必要だが、代わりにインスタンスメソッドとして宣言した場合。

インスタンスメソッドは、クラスのインスタンスを作成するときに使用されるメソッドです。

例は

   def user_group(self):   #This is an instance method
        return "instance method returning group"

クラスラベルメソッド:

   @classmethod
   def user_group(groups):   #This is an class-label method
        return "class method returning group"

Python 2と3のバージョンでは、クラス@classmethodが異なり、Python 3で書き込むと、自動的にクラスラベルメソッドとして取得され、@ classmethodを記述する必要がなくなります。


0

これを試して。Python 2.7.12の場合、コンストラクタを定義するか、各メソッドにselfを追加してから、objectというクラスのインスタンスを定義する必要があります。

import cv2

class calculator:

#   def __init__(self):

def multiply(self, a, b):
    x= a*b
    print(x)

def subtract(self, a,b):
    x = a-b
    print(x)

def add(self, a,b):
    x = a+b
    print(x)

def div(self, a,b):
    x = a/b
    print(x)

 calc = calculator()
 calc.multiply(2,3)
 calc.add(2,3)
 calc.div(10,5)
 calc.subtract(2,3)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.