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 类的 'data' meth() 获取的内容,需要调用 B 类的 handleCOMMAND,这应该会改变 'self.state' 的值

4

4 回答 4

4

除非您有实例可以调用它,否则您不能调用实例方法。

如果不知道你的设计目标是什么,就不可能告诉你实例应该来自哪里,但是有两种特别常见的模式。

首先,该方法可能将B实例作为参数。例如:

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

class B:
    def meth1(self):
        pass

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

为了使这个更具体,想象这A是一个Car,并且B是一个TollRoad,并且my_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是一个服务中心,my_car.schedule_service()需要调用my_car.service_center.get_next_appointment().


作为后者的变体,每个B实例都可以是实例的一种整体,由A实例自动构建A。例如:

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(). 但是,与 a 不同的是ServiceCenter,它是一个独立存在并被许多汽车使用的东西,anEngine仅由它所属的汽车使用,因此没有充分的理由单独创建引擎并将其传递给汽车(除非您正在为汽车工厂建模)。

于 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 回答
0
class A:
    def meth(self):
        "create instance of B class"
        b = B()
        b.meth1()

您也可以将 B.meth1() 声明为静态:

class B:
    @staticmethod
    def meth1():
        pass

然后你可以这样称呼它:

class A:
    def meth(self):
        "create instance of B class"
        B.meth1()
于 2013-04-23T20:29:53.677 回答