如何从另一个类调用类的方法?

时间:2013-04-23 20:27:20

标签: python oop class

我想从另一个类调用一个类的方法。我想做这样的事情。

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的值。状态'

4 个答案:

答案 0 :(得分:4)

除非您有一个实例来调用它,否则无法调用实例方法。

在不知道您的设计目标是什么的情况下,无法告诉您实例的来源,但有两种特别常见的模式。

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

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

class B:
    def meth1(self):
        pass

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

为了使其更加具体,假设ACarBTollRoadmy_car.drive(my_road)必须调用{{1} }}


或者,每个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() 再次为ACar为ServiceCenter,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() 再次是ACarB。因此,Engine开始调用my_car.drive()。但是,与my_car.engine.start()不同,ServiceCenter是一个独立存在且被许多汽车使用的东西,Engine仅用于它所属的汽车,所以没有充分的理由来创造它发动机分开并将其传递给汽车(除非你正在为汽车工厂建模)。

答案 1 :(得分:1)

B被用作静态类。

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

class B:
    @staticmethod
    def meth1():
        pass

a = A()
a.meth()

答案 2 :(得分:0)

class A:
    def meth(self):
        "create instance of B class"
        b = B()
        b.meth1()

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

class B:
    @staticmethod
    def meth1():
        pass

然后你可以这样称呼它:

class A:
    def meth(self):
        "create instance of B class"
        B.meth1()

答案 3 :(得分:0)

此处B.meth1是实例方法,您尝试将其用作类方法。您可以将B.meth1重新定义为类方法:

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

或者,您可以通过实例化B类来将其称为实例方法:

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