在类方法参数中未定义self

时间:2018-08-07 07:50:00

标签: python python-3.x function class

我有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个参数(每个方法中没有参数,但是所有类的所有方法都有摘要),使用该方法,我会得到大约一百行新代码 >而在我看来,这很像“肮脏” 的解决方法...难道没有更简单的方法可以实现这一目标吗?

3 个答案:

答案 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