我试图让我的类根据传递的参数执行给定次数。我的类将字典转换为一些所需的数据。
让我向您展示一个我的意思的快速示例:
第一课A
只提供衍生课程的常用方法。
class A(object):
@staticmethod
def do_magic(obj):
# ...
print(''.obj)
类B
,E
(在示例中跳过)初始化对象并提供b_stuff
和e_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_stuff
和e_stuff
属性一旦初始化 - 生成唯一字符串,它们是c_stuff
的一部分,即将推出每次do_magic()
来电都会更新。
此方法基本上是''.join(obj)
(参见A类)
答案 0 :(得分:1)
class C(B, E):
def do_magic(self):
for _ in range(self.iters):
A.do_magic(self.c_stuff)