Python 从另一个类调用特定于类的方法
我在一个名为AlgoSystem的类中工作,该类在初始化时将策略_0和策略_1作为输入以及策略数(本例中为2)。策略类存储在系统中名为“策略”的字典中。strategy_0和strategy_1本身都是不同的类,但都有一个名为“\u on\u tick”的函数。我想从AlgoSystem类中调用这些函数。 我目前的尝试如下所示:Python 从另一个类调用特定于类的方法,python,function,class,Python,Function,Class,我在一个名为AlgoSystem的类中工作,该类在初始化时将策略_0和策略_1作为输入以及策略数(本例中为2)。策略类存储在系统中名为“策略”的字典中。strategy_0和strategy_1本身都是不同的类,但都有一个名为“\u on\u tick”的函数。我想从AlgoSystem类中调用这些函数。 我目前的尝试如下所示: class AlgoSystem: def __init__(self, strategy_0, strategy_1, numstrategies):
class AlgoSystem:
def __init__(self, strategy_0, strategy_1, numstrategies):
self.var= 1
self.strategies = {0 : strategy_0,
1 : strategy_1}
self.num_strategies = numstrategies
def start(self):
for i in range(self.num_strategies):
self.strategies[i].__on_tick(self.var)
class Strategy_zero:
def __init__(self, x):
self.x = x
def __on_tick(self, var):
self.x = self.x + var
print(self.x)
class Strategy_one:
def __init__(self, y):
self.y = y
def __on_tick(self, var):
self.y = self.y - var
print(self.y)
strategy_0 = Strategy_zero(2)
strategy_1 = Strategy_one(4)
num_strategies = 2
system = AlgoSystem(strategy_0, strategy_1, 2)
system.start()
当我运行上面的代码时,会出现以下错误:
Strategy_zero' object has no attribute '_AlgoSystem__on_tick'
显然,我没有正确地调用类函数“\uu on\u tick”。我该怎么做?我需要以某种方式来做,因此我通过在AlgoSystem中定义的字典“strategies”跟踪两个子类(strategy_0和strategy_1)的变化 双下划线前缀是专门设计的,用于阻止您完全执行正在执行的操作
你没有理由在这里使用它。删除前缀,然后您的方法就可以在_tick上单击
。双下划线前缀是专门设计的,用于阻止您完全执行正在执行的操作
你没有理由在这里使用它。删除前缀,您的方法可以只在_tick
上双下划线名称是隐藏的名称(通过混淆隐藏)。我建议在打勾时调用你的打勾方法,然后再试一次 双下划线名称是隐藏名称(通过混淆隐藏)。我建议在打勾时调用你的打勾方法,然后再试一次 下面的代码可能有助于澄清名称混乱的原因
class A:
def __mangled(self):
print "Class A name-mangled method"
class B:
def __init__(self):
a = A()
try:
a.__mangled()
except AttributeError:
# an attempt to access a name-mangled method assumes that
# the '_{class_name}' prefix should use 'B' as the class name
print "A instance has no attribute '_B__mangled'"
a._A__mangled()
# prints "Class A name-mangled method"
getattr(a, '_{}__mangled'.format(a.__class__.__name__))()
# same thing, but can be done without knowing the class name
B()
因此,您可以将self.strategies[i]。\u在勾选(self.var)
上更新为:
strat = self.strategies[i]
getattr(strat, '_{}__on_tick'.format(strat.__class__.__name__)(self.var)
但是,最好不要在“”前面加双下划线,因为它是在类/实例之外访问的。下面的代码可能有助于澄清名称损坏的原因
class A:
def __mangled(self):
print "Class A name-mangled method"
class B:
def __init__(self):
a = A()
try:
a.__mangled()
except AttributeError:
# an attempt to access a name-mangled method assumes that
# the '_{class_name}' prefix should use 'B' as the class name
print "A instance has no attribute '_B__mangled'"
a._A__mangled()
# prints "Class A name-mangled method"
getattr(a, '_{}__mangled'.format(a.__class__.__name__))()
# same thing, but can be done without knowing the class name
B()
因此,您可以将self.strategies[i]。\u在勾选(self.var)
上更新为:
strat = self.strategies[i]
getattr(strat, '_{}__on_tick'.format(strat.__class__.__name__)(self.var)
但是,最好不要在“”前面加双下划线,因为它是在类/实例之外访问的