我正在用Python3编写一个类,我希望能够从用户那里获取各种关键字参数,并存储这些值以供以后在类方法中使用。示例代码如下所示:
class MathematicalModel:
def __init__(self, var1, var2, var3, **kwargs):
self.var1 = var1
self.var2 = var2
self.var3 = var3
self.var4 = kwarg1
self.var5 = kwarg2
self.var6 = kwarg6
def calculation1(self):
x = self.var1 + self.var2 + self.var3
return x
def calculation2(self):
y = self.var1 * self.var2 * var3
return y
class MathematicalModelExtended(MathematicalModel):
def __init__(self, var1, var2, var3, **kwargs):
super.__init__(self, var1, var2, var3, **kwargs)
def calculation1(self):
'''Overrides calculation1 method from parent DoThis'''
x = (self.var1 + self.var2 + self.var3) / self.kwarg1
return x
def calculation2(self):
'''Overrides calculation2 method from parent DoThis'''
y = (self.var1 * self.var2 * self.var3) / (self.kwarg1 + self.kwarg2)
return y
a = MathematicalModel(1, 2, 3)
b = MathematicalModelExtended(1, 2, 3, var4 = 4, var5 = 5, var6 = 6)
但是,我不确定这是如何工作的,原因如下: a) 如果用户没有为b、c、甚至a提供参数,该怎么办?然后代码将抛出一个错误,因此我不确定在这种情况下如何初始化这些属性。 b) 当我不知道用户事先传递了什么关键字参数时,如何访问与关键字关联的值
我计划在数学公式中使用变量。某些变量(不包括在kwargs
)将在每个公式中使用,而其他变量(在kwargs
中的变量)将仅在其他公式中使用。为了实现这一点,我计划将MathematicalModel
封装在另一个类中,如so MathematicalModelExtended(MathematicalModel)
谢谢大家!
夸尔格一般思想
使用
self.var = value
加载变量时,它会将变量添加到可以使用self.__dict__
访问的内部字典中如果希望允许任意参数,可以利用
kwargs
也是字典这一事实,并使用update()
函数这将防止您在尝试存储不存在的值时出错
如果希望确保在类中设置变量
a
或b
,而不管用户提供了什么,可以创建类属性或使用kwargs.get()
但是,使用此方法,变量属于类而不是实例。这就是为什么会看到
foo5.b
返回字符串,但它不在foo5.__dict__
中如果您允许用户自由指定他们想要的任何
kwargs
,则可以在函数中迭代__dict__
但是,根据您在类中执行的其他操作,最终可能会得到比用户提供的更多的实例属性。因此,最好让用户提供一个字典作为参数
寻址您的代码
对于更新的代码,我建议使用
self.__dict__.update(kwargs)
方法。然后,您可以在没有遇到所依赖的变量(option1
方法)时引发错误,也可以在未定义该变量的情况下为该变量设置默认值(option2
方法)当然,如果
MathematicalModel
永远不会使用除var1
、var2
和var3
之外的任何东西,那么传递kwargs
是没有意义的相关问题 更多 >
编程相关推荐