我想从另一个类调用一个类的方法。我想做这样的事情。
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的值。状态'
答案 0 :(得分: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)
必须调用{{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()
再次为A
,Car
为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()
再次是A
,Car
是B
。因此,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()