类方法参数中的self未被定义

4
我有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个参数(不是每个方法中都有,而是从所有类的所有方法中总结出来的),使用这种方法,我将得到大约一百行新代码,这对我来说似乎非常"肮脏"...难道没有更简单的方法来实现这个吗?


1
kwargs 有帮助吗? - Madhan Varadhodiyil
4
请问您能解释一下您想要用这些方法做什么吗?您的例子有点奇怪... - toti08
好的,你可以使用条件表达式:fruit = self.banana if fruit is None else fruit。这样可以减少一半的代码行数。但我会选择使用完整语句。 - juanpa.arrivillaga
2
你确定需要拥有一个拥有50个参数的方法吗? - Aran-Fey
3个回答

2

这个问题有两种解决方法。

选项1

使用你在问题陈述中展示的方法,但是可以使用三元运算符来简化代码:

def apple(self, fruit=None):
    fruit = fruit if fruit is not None else self.banana

选项2

考虑修改您的代码结构。例如,当调用每个方法时可能不需要允许fruit变化,而是使用预设选项,如self.banana。(基本上完全删除关键字参数fruit,直接使用self.banana即可。) 对于那些需要在方法调用时变化的情况,请使用选项1。


选项2是更好的方法。如果您有50个参数,可以相应地使用*args或**kwargs。 - Ravinder Baid

1

谢谢大家,感谢你们的评论和答案,我找到了完整的解决方案。

>>> 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'

但这对我来说不是问题。如果有人想知道如何仅暂时更改这些内容,请将原始初始化值保存到字典中,然后在您想使用它们时,使用变量更新类字典,如下所示:

>>> 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存储原始信息,并在函数开头刷新类变量。如果kwargs中有内容,则仅覆盖它。


0

最好的选择是为它制作单独的变异体

def setFruit(self, fruit):
    self.fruit = fruit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接