Python 类方法参数中未定义self

Python 类方法参数中未定义self,python,python-3.x,function,class,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

我有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个参数(每个方法都没有,但所有类的所有方法都有摘要),使用这个方法,我将获得大约100行新代码,在我看来,这似乎是非常“肮脏”的解决方法。。。有没有更简单的方法来解决这个问题?

解决这个问题有两种方法

选项1

使用问题陈述中所示的方法,但也可以使用三元运算符来修剪行数:

def apple(self,fruit=None):
水果=水果,如果水果不是别人自己
选项2


考虑修改代码的结构。例如,在调用每个方法时,可能不需要允许每个方法中使用的
水果
,而只需使用预设选项,如
self.banana
。(基本上只需删除关键字参数
fruit
,然后继续使用
self.banana
)对于那些在调用方法时确实需要改变的,请使用选项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'
但这对我来说根本不是问题。如果有人想知道如何使这些更改只是暂时的,请将原始的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存储原始信息,并在函数开头刷新类变量。如果某个东西在kwargs中,它只会覆盖它。

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

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

你能解释一下你想用你的方法做什么吗?您的示例有点奇怪……好吧,您可以使用一个条件表达式:
fruit=self.banana如果水果不是其他水果
。这样就把你的台词一分为二了。我只想使用完整的语句。您确定需要一个具有50(!)个参数的方法吗?选项2是一个更好的方法。如果有50个参数,可以相应地使用*args或**kwargs