0

クラスのメソッドを別のクラスから呼び出したい。私はこのようなことをしたいと思います。

class A:
    def meth(self):
        B.meth1()

class B:
    def meth1(self):
        pass

a = A()
a.meth()

次のエラーが表示されます。

TypeError: unbound method meth1() must be called with B instance as first argument (got nothing instead)

私は何を間違っていますか?

アップデート:

上記の例は、おそらく少しあいまいです。これが私がまさにやろうとしていることです:

class A:
    def meth(self, data):
        if data[0] == '/':
            B.handleCOMMAND(data)

class B:
    def handleCOMMAND(self, data):
        """
        Some code to handle some command.
        """

更新 2:

class A:
    def meth(self, data):
        if data[0] == '/':
            B.handleCOMMAND(data)

class B:
    def __init__(self):
        self.state = 'CHAT'

    def handleCOMMAND(self, data):
        if data.strip().split()[1] == 'send':
             self.state == 'RECV-FILE'

私が直面している主な問題は次のとおりです。

「self.state」はクラス B のインスタンス変数です。また、クラス A の「データ」meth() が取得するものに応じて、「self.state」の値を変更するクラス B の handleCOMMAND を呼び出す必要があります。

4

4 に答える 4

4

呼び出すインスタンスがない限り、インスタンス メソッドを呼び出すことはできません。

設計の目標が何であるかを知らなければ、インスタンスがどこから来るべきかを知ることは不可能ですが、特に一般的なパターンが 2 つあります。

まず、メソッドはBインスタンスをパラメーターとして受け取る場合があります。例えば:

class A:
    def meth(self, b):
        b.meth1()

class B:
    def meth1(self):
        pass

a = A()
b = B()
a.meth(b)

これをより具体的にするために、それがAであり、CarBありTollRoadmy_car.drive(my_road)を呼び出さなければならないことを想像してくださいmy_road.pay_toll()


または、各インスタンスがメンバーとしてAインスタンスを所有する場合があります。B例えば:

class A:
    def __init__(self, b):
        self.b = b
    def meth(self):
        self.b.meth1()

class B:
    def meth1(self):
        pass

b = B()   
a = A(b)
a.meth()

これをより具体的にするために、これがA再びCarでありB、ServiceCenter であり、my_car.schedule_service()を呼び出す必要があると想像してくださいmy_car.service_center.get_next_appointment()


後者のバリエーションとして、各インスタンスは、インスタンスによって自動的に構築された、インスタンスBの全体の一部のようなものである場合があります。例えば:AA

class A:
    def __init__(self):
        self.b = B()
    def meth(self):
        self.b.meth1()

class B:
    def meth1(self):
        pass

a = A()
a.meth()

Aこれについては、それがCar再びであり、でBあると想像してくださいEngine。それで、my_car.drive()呼び出しから始めますmy_car.engine.start()。ただし、ServiceCenter単独で存在し、多くの車で使用される とは異なり、 はそのEngine一部である車でのみ使用されるため、エンジンを個別に作成して車に渡す正当な理由はありません (自動車工場をモデル化しています)。

于 2013-04-23T20:33:27.557 に答える
1

B は静的クラスとして使用されています。

class A:
    def meth(self):
        B.meth1()

class B:
    @staticmethod
    def meth1():
        pass

a = A()
a.meth()
于 2013-04-23T20:33:52.613 に答える
0

ここで、B.meth1 はインスタンス メソッドであり、これをクラス メソッドとして使用しようとしています。B.meth1 をクラスメソッドとして再定義することもできます:

class B:
  @classmethod
  def meth1(cls):
    pass

または、B クラスをインスタンス化してインスタンス メソッドとして呼び出すこともできます。

class A:
    def meth(self):
        B().meth1()
于 2013-04-23T20:32:33.477 に答える