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

时间:2017-05-01 13:29:30

标签: python function class

我在一个名为AlgoSystem的类中工作,在初始化时将strategy_0和strategy_1作为输入,以及策略的数量(在本例中为2)。策略类存储在名为"策略"的字典中。在AlgoSystem中。 strategy_0和strategy_1都是不同的类本身,但都有一个名为" __ on_tick"的函数。我想从AlgoSystem类中调用这些函数。 我目前尝试这样做的目的如下:

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"正常。我该怎么做?我需要以某种方式进行,所以我通过AlgoSystem中定义的字典跟踪两个子类(strategy_0和strategy_1)的变化:"策略"。

3 个答案:

答案 0 :(得分:3)

双下划线前缀专门用于阻止您完成您正在执行的操作。

你没有理由在这里使用它。删除前缀,您的方法只能on_tick

答案 1 :(得分:1)

双下划线名称是隐藏名称(通过混淆隐藏)。我建议你的on_tick方法被调用on_tick并再试一次。

答案 2 :(得分:0)

以下代码可能有助于澄清名称错误的原因。

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之前加上双下划线,因为它打算在类/实例之外访问。