gpt4 book ai didi

python 最佳实践——类非常相似,但构造函数不同

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:16 27 4
gpt4 key购买 nike

我创建了四个类:experiment、experiment_type1、experiment_type2 和 experiment_type3

experiment是一个抽象类,不能被实例化。它有 2 个方法,__init__(self)run(self),其中 run(self) 是抽象的。

experiment_type1experiment_type2 源自实验。它们从 experiment 继承了 __init__(self)(因此它们共享相同的构造函数)但是它们实现的 run(self) 彼此不同。

我的问题是 experiment_type3 类。它也只有 run(self) 方法,实现方式与 experiment_type1experiment_type2 不同,但它的构造函数需要一个额外的参数。它的构造函数的形式是 __init__(self, parameter)

理想情况下,我希望experiment_type3 派生自experiment。但是构造函数不匹配。处理这个问题的最佳方法是什么?在这种情况下使用 Python 编程。

编辑:这是 experiment 和 experiment_type3 的代码。如您所见,它取决于不存在的 self.epsilon。

将 numpy 导入为 np从 abc 导入 ABC,抽象方法从 Bandit 导入 Bandit

class experiment(ABC):
def __init__(self, num_iter, bandit_list): #epsilon is the chance to explore, num_iter is num of iterations, bandit_list is the list of the bandits
self.num_iter = num_iter
self.bandit_list = bandit_list
self.best_bandit = np.random.choice(len(bandit_list))

@abstractmethod
def run(self):
raise NotImplementedError('derived class must implement run() method!')

class eg_experiment(experiment):
def run(self):
for iteration in range(self.num_iter):
bandit = np.random.choice(len(self.bandit_list))
if(np.random.random() > self.epsilon):
bandit = self.best_bandit
self.bandit_list[self.best_bandit].pull()
self.best_bandit = np.argmax([bandit.current_mean for bandit in self.bandit_list])

最佳答案

正如评论所指出的,在父类的 __init__ 上使用 super() 应该会给你你想要的。

class A:
def __init__(self, parameter)
self.parameter = parameter

class B(A):
def __init__(self, parameter, new_parameter)
super().__init__(parameter)
self.new_parameter = parameter

或者在你的情况下

class eg_experiment(experiment):
def __init__(num_iter, bandit_list, epsilon):
super().__init__(num_iter, bandit_list) #Python3
# super(experiment,self).__init__(num_iter, bandit_list) # Pythyon2.7
self.epsilon = epsilon

关于python 最佳实践——类非常相似,但构造函数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44332724/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com