Python 如何从另一个类调用一个类的方法?
我想从另一个类调用一个类的方法。我想做这样的事Python 如何从另一个类调用一个类的方法?,python,oop,class,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):
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 __init__(self):
self.state = 'CHAT'
def handleCOMMAND(self, data):
if data.strip().split()[1] == 'send':
self.state == 'RECV-FILE'
上面的例子可能有点模糊。以下是我真正打算做的:
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”的值
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()
还可以将B.meth1()声明为静态:
class B:
@staticmethod
def meth1():
pass
然后你可以这样称呼它:
class A:
def meth(self):
"create instance of B class"
B.meth1()
这里B.meth1是一个实例方法,您正试图将其用作类方法。您可以将B.meth1重新定义为classmethod:
class B:
@classmethod
def meth1(cls):
pass
或者,您可以通过实例化B类将其作为实例方法调用:
class A:
def meth(self):
B().meth1()
这里B.meth1是一个实例方法,您正试图将其用作类方法。您可以将B.meth1重新定义为classmethod:
class B:
@classmethod
def meth1(cls):
pass
或者,您可以通过实例化B类将其作为实例方法调用:
class A:
def meth(self):
B().meth1()
除非有实例可调用,否则不能调用实例方法 如果不知道您的设计目标是什么,就不可能告诉您实例应该来自哪里,但是有两种特别常见的模式 首先,该方法可以将
B
实例作为参数。例如:
class A:
def meth(self, b):
b.meth1()
class B:
def meth1(self):
pass
a = A()
b = B()
a.meth(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()
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
是汽车
,B
是收费公路
,而我的汽车.驾驶(我的路)
必须呼叫我的路.支付通行费()
或者,每个
A
实例可以拥有一个B
实例作为成员。例如:
class A:
def meth(self, b):
b.meth1()
class B:
def meth1(self):
pass
a = A()
b = B()
a.meth(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()
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
是服务中心,mycar.schedule\u service()
需要调用mycar.service\u center.get\u next\u appointment()
作为后者的变体,每个
B
实例可以是a
实例整体的一部分,由a
实例自动构造。例如:
class A:
def meth(self, b):
b.meth1()
class B:
def meth1(self):
pass
a = A()
b = B()
a.meth(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()
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
是汽车
,而B
是发动机
。因此,my\u car.drive()
开始调用my\u car.engine.start()
。但是,与独立存在且被许多汽车使用的服务中心不同,引擎只被它所属的汽车使用,因此没有充分的理由单独创建引擎并将其传递给汽车(除非你正在为汽车工厂建模).除非有实例可供调用,否则不能调用实例方法
如果不知道您的设计目标是什么,就不可能告诉您实例应该来自哪里,但是有两种特别常见的模式
首先,该方法可以将B
实例作为参数。例如:
class A:
def meth(self, b):
b.meth1()
class B:
def meth1(self):
pass
a = A()
b = B()
a.meth(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()
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
是汽车
,B
是收费公路
,而我的汽车.驾驶(我的路)
必须呼叫我的路.支付通行费()
或者,每个A
实例可以拥有一个B
实例作为成员。例如:
class A:
def meth(self, b):
b.meth1()
class B:
def meth1(self):
pass
a = A()
b = B()
a.meth(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()
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
是服务中心,mycar.schedule\u service()
需要调用mycar.service\u center.get\u next\u appointment()
作为后者的变体,每个B
实例可以是a
实例整体的一部分,由a
实例自动构造。例如:
class A:
def meth(self, b):
b.meth1()
class B:
def meth1(self):
pass
a = A()
b = B()
a.meth(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()
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
是汽车
,而B
是发动机
。因此,my\u car.drive()
开始调用my\u car.engine.start()
。但是,与独立存在且被许多汽车使用的服务中心不同,引擎只由它所属的汽车使用,因此没有充分的理由单独创建引擎并将其传递给汽车(除非你正在为汽车工厂建模)。B被用作静态类
class A:
def meth(self):
B.meth1()
class B:
@staticmethod
def meth1():
pass
a = A()
a.meth()
B被用作静态类
class A:
def meth(self):
B.meth1()
class B:
@staticmethod
def meth1():
pass
a = A()
a.meth()
你希望它的效果是什么?一般来说,B
方法需要一个B
实例才能工作,但如果您是从a
调用的,则没有B
实例。(如果B.meth1
不需要实例,则将其改为classmethod。如果它甚至不需要该类,则将其从类中取出并将其变为函数。)如果您只希望能够为类a使用其中一个类B方法,则应为此使用。这就是你想要的吗?也许你想要B.meth1
成为staticmethod
?没有更多的细节,真的很难确定任何事情。@RyanSaxe:这可能是答案,但肯定不能保证,甚至可能不是最有可能的答案。(正如mgilson所说,在不知道他的设计的情况下,不可能确定。)这是非常正确的,这就是为什么我问他这是否是他想要的……但他问的方式似乎是他想要能够从类A中的类B调用方法,这就是继承。你所说的最有可能的可能性是什么意思?他问什么的可能性?你希望结果是什么?一般来说,B
方法需要一个B
实例才能工作,但如果您是从a
调用的,则没有B
实例。(如果B.meth1
不需要实例,则将其改为classmethod