从另一类调用特定于类的方法



我在一个名为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之前,因为它打算在类/实例之外访问。

相关内容

最新更新