我在一个名为algosystem的类中工作,该类别将策略_0和stragity_1作为初始化和策略数量(在这种情况下为2(。策略类别存储在算法中的词典中,算法在算法系统中。Strategy_0和stragity_1都是不同的类本身,但都具有称为" __ON_TICK"的函数。我想从算法系统类中调用这些功能。我目前的尝试如下:
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'
显然,我没有正确地称其为" __ON_TICK"。我应该怎么做?我需要以某种方式进行操作,因此我可以通过我在算法系统中定义的字典来跟踪两个子类(strument_0 and Strategy_1(的变化:"策略"。
双重下划线前缀是专门设计的,以防止您确切地做自己在做的事情。
您没有理由在这里使用它。删除前缀,您的方法只能on_tick
。
double下划线名称是隐藏的名称(被混淆隐藏(。我建议让您的on_tick方法称为on_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].__on_tick(self.var)
为:
strat = self.strategies[i]
getattr(strat, '_{}__on_tick'.format(strat.__class__.__name__)(self.var)
但是,最好不要在__on_tick
之前使用Double-underscore之前,因为它打算在类/实例之外访问。