2

初心者からの質問です。デコレーター @classmethod を使用してメソッド内でメソッドを呼び出そうとしていますが、これを実現する方法はありますか? たとえば、私は持っています:

class A():
    def B(self):
    #do something
    return something

    @classmethod
    def C(cls):
    #do something
    x = B() #call B method
    return None

エラーが発生しました:

NameError: global name 'B' is not defined

B を呼び出すことはできますか、それとも B をクラス メソッドとして定義する必要がありますか?

4

3 に答える 3

1

ここでの問題は、関数が「ユーザー定義」であることではありません。問題は、「x=B()」がクラス内で「B」というメソッドを呼び出さず、クラス内で「B」というメソッドを呼び出すことです。グローバル名前空間。

何が起こっているかを説明するために、次のコードを見てください。

B="1"

class A():
    B="2"

    def myfunc(cls):
        print B

a = A()
a.myfunc()

それを実行すると、出力が1.

printステートメントを に変更すると、print A.Bが得られます2

あなたの場合A.B()、単にではなく呼び出す必要がありますB()

ただし、他の人が指摘しているようにB()、インスタンスメソッドです。渡された最初のパラメーターがクラスのインスタンスであると想定しています。B の動作によっては、それを渡すインスタンスがないために問題が発生する可能性があります。他のオブジェクト (クラス自体など) を渡すか、渡す新しいオブジェクトを作成することで、さまざまな方法でこれを回避できます。しかし、私には、C() がインスタンス メソッドを呼び出す必要がある場合、C() はインスタンス メソッド自体である必要があるようです。

クラス メソッドとインスタンス メソッドの違いでは、クラス メソッドとインスタンス メソッドの違いについて説明しています。

于 2014-07-11T22:50:28.420 に答える
0

これを機能させるには、次のようにする必要があります。

class A():

    def B(self):
        #do something (with self! so this requires A to be instantiated!)
        return something

    @classmethod
    def C(cls):
        #do something
        return cls().B() #instantiate class, call B method, and return results 
于 2014-07-11T22:47:31.927 に答える
0

クラス メソッドは、インスタンス データを必要としないメソッドです。B が を使用して暗示されるようにインスタンス データを必要とする場合self、A はクラス メソッドであってはなりません。B がインスタンス データを必要としない場合は、それをクラス メソッドとして定義し、cls.B() を使用して呼び出すことができます。

于 2014-07-11T22:34:44.773 に答える