如何在Python中触发相同类对象的2个实例中的方法?



我有同一个类(State)的两个实例(st0, st1),其中有两个方法。当st0loc_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()

两个实例互不认识。所以这不是推荐的情况,但如果你真的想这么做,请在列表中恢复所有实例,当你想触发其中一个时,只需循环找到它。这就是答案!可能对你有帮助。

最新更新