我有4个类,每个类中都有几种方法。我需要这些方法来将一些类变量用作参数,例如。
class Orange:
def __init__(self,banana):
self.banana = banana
def apple(self,fruit=self.banana):
return something
我已经发现这不起作用,因为在创建函数时而不是在调用函数时定义了方法参数,因此我在这里找到了解决方法:
def apple(self,fruit=None):
if fruit is None:
fruit = self.banana
但是问题是,我有大约50个参数(每个方法中没有参数,但是所有类的所有方法都有摘要),使用该方法,我会得到大约一百行新代码 >而在我看来,这很像“肮脏” 的解决方法...难道没有更简单的方法可以实现这一目标吗?
答案 0 :(得分:1)
有两种方法可以解决此问题。
选项1
使用您在问题陈述中显示的方法,但也许使用三元运算符来修剪行数:
def apple(self, fruit=None):
fruit = fruit if fruit else self.banana
选项2
考虑修改代码的结构。例如,可能不必让每种方法中使用的fruit
在被调用时发生变化,而只需要使用诸如self.banana
之类的预设选项即可。 (基本上完全删除关键字参数fruit
,然后继续使用self.banana
。)对于那些在调用方法时确实需要更改的参数,请采用选项1。
答案 1 :(得分:0)
谢谢大家,感谢您的评论和回答,我找到了一个完整的解决方案。
>>> class Orange:
... def __init__(self,banana="a"):
... self.banana = banana
... def apple(self,**kwargs):
... self.__dict__.update(kwargs)
... return self.banana
...
>>> test = Orange()
>>> test.apple()
'a'
>>> test.apple(banana="b")
'b'
如您所见,传递不同的关键字变量将完全按照我的意愿更改结果。但是,唯一的缺点(但也可能是优点,取决于观点)是此更改是永久性的,因此,如果再次调用该函数,其更改仍将如下所示:
>>> test.apple()
'b'
但这对我来说根本不是问题。如果有人想知道如何仅临时更改,请将原始init值保存到dict,然后在要使用它们时,使用保存这些值的变量更新类dict,如下所示:
>>> class Orange:
... def __init__(self,fruit={"banana":"a","cherry":"b"}):
... self.fruit=fruit
... def apple(self,**kwargs):
... self.__dict__.update(self.fruit)
... self.__dict__.update(kwargs)
... return self.banana
...
>>> test = Orange()
>>> test.apple()
'a'
>>> test.apple(banana="b")
'b'
>>> test.apple()
'a'
Self.fruit存储原始信息,并在函数开始时刷新类变量。如果kwarg中有东西,它将被覆盖。
答案 2 :(得分:0)
最好的选择是为其制作一个单独的Mutator
def setFruit(self, fruit):
self.fruit = fruit