我有同一个类(State)的两个实例(st0, st1),其中有两个方法。当st0当loc_st()被调用时,我希望st1.rem_st()自动触发。我如何用Python OOP实现这个目的?对不起,代码看起来有点幼稚,但它是一个简化的模型,节省了阅读的精力。
import random
class State(object):
def __init__(self) -> None:
self.s = ['S0', 'S1', 'S2']
def loc_sc(self):
# how to trigger a remote method in different class?
print (self.s)
def rem_sc(self):
random.shuffle(self.s)
print (self.s)
if __name__ == '__main__':
st0 = State()
st1 = State()
# how can I trigger st1.rem_sc() automatically
# when st0.loc_sc is called
st0.loc_sc()
如果你想要调用每个实例的方法,你可以在类中添加一个列表,遍历所有实例并调用它们的方法:
import random
class State(object):
instances = []
def __init__(self) -> None:
self.in_trigger = 0
self.ex_trigger = 0
self.s = ['S0', 'S1', 'S2']
State.instances.append(self)
def loc_sc(self):
# how to trigger a remote method in different class?
print (self.s)
for i in State.instances:
i.rem_sc()
def rem_sc(self):
if self.ex_trigger:
random.shuffle(self.s)
print (self.s)
if __name__ == '__main__':
st0 = State()
st1 = State()
st0.loc_sc()
或者您可以向类构造函数中添加实例数组。当方法在一个实例上被调用时,你可以遍历该数组中的所有实例并调用方法:
import random
class State(object):
def __init__(self, instances=[]) -> None:
self.in_trigger = 0
self.ex_trigger = 0
self.s = ['S0', 'S1', 'S2']
self.instances = instances
def loc_sc(self):
# how to trigger a remote method in different class?
print(self.s)
for i in self.instances:
i.rem_sc()
def rem_sc(self):
if self.ex_trigger:
random.shuffle(self.s)
print (self.s)
if __name__ == '__main__':
st1 = State()
st0 = State([st1])
st0.loc_sc()
如果您想先初始化st0,您可以向类添加一个addInstance方法,它将向该实例的实例数组中添加一个实例:
import random
class State(object):
def __init__(self, instances=[]) -> None:
self.in_trigger = 0
self.ex_trigger = 0
self.s = ['S0', 'S1', 'S2']
self.instances = instances
def loc_sc(self):
# how to trigger a remote method in different class?
print(self.s)
for i in self.instances:
i.rem_sc()
def rem_sc(self):
if self.ex_trigger:
random.shuffle(self.s)
print (self.s)
def addInstance(self, instance):
self.instances.append(instance)
if __name__ == '__main__':
st0 = State()
st1 = State()
st0.addInstance(st1)
st0.loc_sc()
或者您也可以向构造函数添加一个引用,以便实例本身被添加到该引用的实例中。
import random
class State(object):
def __init__(self, reference=None) -> None:
self.in_trigger = 0
self.ex_trigger = 0
self.s = ['S0', 'S1', 'S2']
self.instances = []
if reference != None: reference.instances.append(self)
def loc_sc(self):
# how to trigger a remote method in different class?
print(self.s)
for i in self.instances:
i.rem_sc()
def rem_sc(self):
if self.ex_trigger:
random.shuffle(self.s)
print (self.s)
if __name__ == '__main__':
st0 = State()
st1 = State(st0)
st0.loc_sc()
两个实例互不认识。所以这不是推荐的情况,但如果你真的想这么做,请在列表中恢复所有实例,当你想触发其中一个时,只需循环找到它。这就是答案!可能对你有帮助。