使用给定输入参数

时间:2016-01-07 17:24:02

标签: python oop

我试图让我的类根据传递的参数执行给定次数。我的类将字典转换为一些所需的数据。

让我向您展示一个我的意思的快速示例:

第一课A只提供衍生课程的常用方法。

class A(object):
    @staticmethod
    def do_magic(obj):
    # ...
    print(''.obj)

BE(在示例中跳过)初始化对象并提供b_stuffe_stuff

class B(A):
    def __init__(self, mydict):
    #
    self.b_stuff = [...]

现在班级C开始发挥作用。它基本上转换给定字典mydict,它具有一个描述迭代次数的键值对'iters': 'val'

class C(B, E):
    def __init__(self, mydict):
        B.__init__(self, mydict) # access to b_stuff
        E.__init__(self, mydict) # access to e_stuff

        self.iters = int(self.mydict['iters'])     # desired nb of initialisations/executions
        self.c_stuff = [b_stuff, e_stuff, other]        

    def do_magic(self):
        A.do_magic(self.c_stuff) 

现在问题是,一旦在代码中稍后从外部循环调用一个类,我就不知道如何使我的课程成为do_magic mydict['iters']次。

for d in list_of_dicts:
    C(d).do_magic()

其中一个解决方案可能就是我会在上面的外部循环中初始化这个类,就像那样:

for d in list_of_dicts:
    for i in range(int(d['iters']))
        C(d).do_magic()

但它感觉远离OOP风格。

要100%确定你们的人跟着我,这里显示实际的预期行为:
d - 输入字典
d['iters'] = 2

执行

C(d).do_magic()

实际结果:

>>> 
'XXX YYY RANDOM_NUMBER1 .... '  

预期结果:

>>> 
'XXX YYY RANDOM_NUMBER1 .... '  
'XXX YYY RANDOM_NUMBER2 .... '  # random number from class B re-initialised!!

作为探索堆栈,我发现了一些提示引用__new__方法,但仍然没有线索,如果这是一条正确的路径,以及如何:)

修改

正如@ Peter-wood建议的那样 - 添加一个问题:

我想指出,b_stuffe_stuff属性一旦初始化 - 生成唯一字符串,它们是c_stuff的一部分,即将推出每次do_magic()来电都会更新。

此方法基本上是''.join(obj)(参见A类)

1 个答案:

答案 0 :(得分:1)

class C(B, E):
    def do_magic(self):
        for _ in range(self.iters):
            A.do_magic(self.c_stuff)